1c4762a1bSJed Brown! Program usage: mpiexec -n 1 chwirut1f [-help] [all TAO options] 2c4762a1bSJed Brown! 3c4762a1bSJed Brown! Description: This example demonstrates use of the TAO package to solve a 4c4762a1bSJed Brown! nonlinear least-squares problem on a single processor. We minimize the 5c4762a1bSJed Brown! Chwirut function: 6c4762a1bSJed Brown! sum_{i=0}^{n/2-1} ( alpha*(x_{2i+1}-x_{2i}^2)^2 + (1-x_{2i})^2) 7c4762a1bSJed Brown! 8c4762a1bSJed Brown! The C version of this code is chwirut1.c 9c4762a1bSJed Brown! 10c4762a1bSJed Brown 11c4762a1bSJed Brown! 12c4762a1bSJed Brown! ---------------------------------------------------------------------- 13c4762a1bSJed Brown! 14c4762a1bSJed Brown#include "chwirut2f.h" 15c4762a1bSJed Brown 16c4762a1bSJed Brown! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17c4762a1bSJed Brown! Variable declarations 18c4762a1bSJed Brown! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 19c4762a1bSJed Brown! 20c4762a1bSJed Brown! See additional variable declarations in the file chwirut2f.h 21c4762a1bSJed Brown 22c4762a1bSJed Brown PetscErrorCode ierr ! used to check for functions returning nonzeros 23c4762a1bSJed Brown Vec x ! solution vector 24c4762a1bSJed Brown Vec f ! vector of functions 25c4762a1bSJed Brown Tao tao ! Tao context 26c4762a1bSJed Brown 27c4762a1bSJed Brown! Note: Any user-defined Fortran routines (such as FormGradient) 28c4762a1bSJed Brown! MUST be declared as external. 29c4762a1bSJed Brown 30c4762a1bSJed Brown external FormFunction 31c4762a1bSJed Brown 32c4762a1bSJed Brown! Initialize TAO and PETSc 33*d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 34*d8606c27SBarry Smith PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD,size,ierr)) 35*d8606c27SBarry Smith PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)) 36c4762a1bSJed Brown 37c4762a1bSJed Brown! Initialize problem parameters 38c4762a1bSJed Brown call InitializeData() 39c4762a1bSJed Brown 40c4762a1bSJed Brown if (rank .eq. 0) then 41c4762a1bSJed Brown! Allocate vectors for the solution and gradient 42*d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF,n,x,ierr)) 43*d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF,m,f,ierr)) 44c4762a1bSJed Brown 45c4762a1bSJed Brown! The TAO code begins here 46c4762a1bSJed Brown 47c4762a1bSJed Brown! Create TAO solver 48*d8606c27SBarry Smith PetscCallA(TaoCreate(PETSC_COMM_SELF,tao,ierr)) 49*d8606c27SBarry Smith PetscCallA(TaoSetType(tao,TAOPOUNDERS,ierr)) 50c4762a1bSJed Brown 51c4762a1bSJed Brown! Set routines for function, gradient, and hessian evaluation 52*d8606c27SBarry Smith PetscCallA(TaoSetResidualRoutine(tao,f,FormFunction,0,ierr)) 53c4762a1bSJed Brown 54c4762a1bSJed Brown! Optional: Set initial guess 55c4762a1bSJed Brown call FormStartingPoint(x) 56*d8606c27SBarry Smith PetscCallA(TaoSetSolution(tao, x, ierr)) 57c4762a1bSJed Brown 58c4762a1bSJed Brown! Check for TAO command line options 59*d8606c27SBarry Smith PetscCallA(TaoSetFromOptions(tao,ierr)) 60c4762a1bSJed Brown! SOLVE THE APPLICATION 61*d8606c27SBarry Smith PetscCallA(TaoSolve(tao,ierr)) 62c4762a1bSJed Brown 63c4762a1bSJed Brown! Free TAO data structures 64*d8606c27SBarry Smith PetscCallA(TaoDestroy(tao,ierr)) 65c4762a1bSJed Brown 66c4762a1bSJed Brown! Free PETSc data structures 67*d8606c27SBarry Smith PetscCallA(VecDestroy(x,ierr)) 68*d8606c27SBarry Smith PetscCallA(VecDestroy(f,ierr)) 69*d8606c27SBarry Smith PetscCallA(StopWorkers(ierr)) 70c4762a1bSJed Brown 71c4762a1bSJed Brown else 72*d8606c27SBarry Smith PetscCallA(TaskWorker(ierr)) 73c4762a1bSJed Brown endif 74c4762a1bSJed Brown 75*d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 76c4762a1bSJed Brown end 77c4762a1bSJed Brown 78c4762a1bSJed Brown! -------------------------------------------------------------------- 79c4762a1bSJed Brown! FormFunction - Evaluates the function f(X) and gradient G(X) 80c4762a1bSJed Brown! 81c4762a1bSJed Brown! Input Parameters: 82c4762a1bSJed Brown! tao - the Tao context 83c4762a1bSJed Brown! X - input vector 84c4762a1bSJed Brown! dummy - not used 85c4762a1bSJed Brown! 86c4762a1bSJed Brown! Output Parameters: 87c4762a1bSJed Brown! f - function vector 88c4762a1bSJed Brown 89c4762a1bSJed Brown subroutine FormFunction(tao, x, f, dummy, ierr) 90c4762a1bSJed Brown#include "chwirut2f.h" 91c4762a1bSJed Brown 92c4762a1bSJed Brown Tao tao 93c4762a1bSJed Brown Vec x,f 94c4762a1bSJed Brown PetscErrorCode ierr 95c4762a1bSJed Brown 96c4762a1bSJed Brown PetscInt i,checkedin 97c4762a1bSJed Brown PetscInt finished_tasks 984a713726SSatish Balay PetscMPIInt next_task 99c4762a1bSJed Brown PetscMPIInt status(MPI_STATUS_SIZE),tag,source 100c4762a1bSJed Brown PetscInt dummy 101c4762a1bSJed Brown 102c4762a1bSJed Brown! PETSc's VecGetArray acts differently in Fortran than it does in C. 103*d8606c27SBarry Smith! Calling VecGetArray((Vec) X, (PetscReal) x_array(0:1), (PetscOffset) x_index, ierr)) 104c4762a1bSJed Brown! will return an array of doubles referenced by x_array offset by x_index. 105c4762a1bSJed Brown! i.e., to reference the kth element of X, use x_array(k + x_index). 106c4762a1bSJed Brown! Notice that by declaring the arrays with range (0:1), we are using the C 0-indexing practice. 10717a42bb7SSatish Balay PetscReal f_v(0:1),x_v(0:1),fval(1) 108c4762a1bSJed Brown PetscOffset f_i,x_i 109c4762a1bSJed Brown 110c4762a1bSJed Brown ierr = 0 111c4762a1bSJed Brown 112c4762a1bSJed Brown! Get pointers to vector data 113*d8606c27SBarry Smith PetscCall(VecGetArray(x,x_v,x_i,ierr)) 114*d8606c27SBarry Smith PetscCall(VecGetArray(f,f_v,f_i,ierr)) 115c4762a1bSJed Brown 116c4762a1bSJed Brown! Compute F(X) 117c4762a1bSJed Brown if (size .eq. 1) then 118c4762a1bSJed Brown ! Single processor 119c4762a1bSJed Brown do i=0,m-1 120*d8606c27SBarry Smith PetscCall(RunSimulation(x_v(x_i),i,f_v(i+f_i),ierr)) 121c4762a1bSJed Brown enddo 122c4762a1bSJed Brown else 1239dddd249SSatish Balay ! Multiprocessor main 1244a713726SSatish Balay next_task = zero 125c4762a1bSJed Brown finished_tasks = 0 126c4762a1bSJed Brown checkedin = 0 127c4762a1bSJed Brown 128c4762a1bSJed Brown do while (finished_tasks .lt. m .or. checkedin .lt. size-1) 129*d8606c27SBarry Smith PetscCallMPI(MPI_Recv(fval,one,MPIU_SCALAR,MPI_ANY_SOURCE,MPI_ANY_TAG,PETSC_COMM_WORLD,status,ierr)) 130c4762a1bSJed Brown tag = status(MPI_TAG) 131c4762a1bSJed Brown source = status(MPI_SOURCE) 132c4762a1bSJed Brown if (tag .eq. IDLE_TAG) then 133c4762a1bSJed Brown checkedin = checkedin + 1 134c4762a1bSJed Brown else 13517a42bb7SSatish Balay f_v(f_i+tag) = fval(1) 136c4762a1bSJed Brown finished_tasks = finished_tasks + 1 137c4762a1bSJed Brown endif 138c4762a1bSJed Brown if (next_task .lt. m) then 139c4762a1bSJed Brown ! Send task to worker 140*d8606c27SBarry Smith PetscCallMPI(MPI_Send(x_v(x_i),nn,MPIU_SCALAR,source,next_task,PETSC_COMM_WORLD,ierr)) 1414a713726SSatish Balay next_task = next_task + one 142c4762a1bSJed Brown else 143c4762a1bSJed Brown ! Send idle message to worker 144*d8606c27SBarry Smith PetscCallMPI(MPI_Send(x_v(x_i),nn,MPIU_SCALAR,source,IDLE_TAG,PETSC_COMM_WORLD,ierr)) 145c4762a1bSJed Brown end if 146c4762a1bSJed Brown enddo 147c4762a1bSJed Brown endif 148c4762a1bSJed Brown 149c4762a1bSJed Brown! Restore vectors 150*d8606c27SBarry Smith PetscCall(VecRestoreArray(x,x_v,x_i,ierr)) 151*d8606c27SBarry Smith PetscCall(VecRestoreArray(F,f_v,f_i,ierr)) 152c4762a1bSJed Brown return 153c4762a1bSJed Brown end 154c4762a1bSJed Brown 155c4762a1bSJed Brown subroutine FormStartingPoint(x) 156c4762a1bSJed Brown#include "chwirut2f.h" 157c4762a1bSJed Brown 158c4762a1bSJed Brown Vec x 159c4762a1bSJed Brown PetscReal x_v(0:1) 160c4762a1bSJed Brown PetscOffset x_i 161c4762a1bSJed Brown PetscErrorCode ierr 162c4762a1bSJed Brown 163*d8606c27SBarry Smith PetscCall(VecGetArray(x,x_v,x_i,ierr)) 164c4762a1bSJed Brown x_v(x_i) = 0.15 165c4762a1bSJed Brown x_v(x_i+1) = 0.008 166c4762a1bSJed Brown x_v(x_i+2) = 0.01 167*d8606c27SBarry Smith PetscCall(VecRestoreArray(x,x_v,x_i,ierr)) 168c4762a1bSJed Brown return 169c4762a1bSJed Brown end 170c4762a1bSJed Brown 171c4762a1bSJed Brown subroutine InitializeData() 172c4762a1bSJed Brown#include "chwirut2f.h" 173c4762a1bSJed Brown 174c4762a1bSJed Brown PetscInt i 175c4762a1bSJed Brown i=0 176c4762a1bSJed Brown y(i) = 92.9000; t(i) = 0.5000; i=i+1 177c4762a1bSJed Brown y(i) = 78.7000; t(i) = 0.6250; i=i+1 178c4762a1bSJed Brown y(i) = 64.2000; t(i) = 0.7500; i=i+1 179c4762a1bSJed Brown y(i) = 64.9000; t(i) = 0.8750; i=i+1 180c4762a1bSJed Brown y(i) = 57.1000; t(i) = 1.0000; i=i+1 181c4762a1bSJed Brown y(i) = 43.3000; t(i) = 1.2500; i=i+1 182c4762a1bSJed Brown y(i) = 31.1000; t(i) = 1.7500; i=i+1 183c4762a1bSJed Brown y(i) = 23.6000; t(i) = 2.2500; i=i+1 184c4762a1bSJed Brown y(i) = 31.0500; t(i) = 1.7500; i=i+1 185c4762a1bSJed Brown y(i) = 23.7750; t(i) = 2.2500; i=i+1 186c4762a1bSJed Brown y(i) = 17.7375; t(i) = 2.7500; i=i+1 187c4762a1bSJed Brown y(i) = 13.8000; t(i) = 3.2500; i=i+1 188c4762a1bSJed Brown y(i) = 11.5875; t(i) = 3.7500; i=i+1 189c4762a1bSJed Brown y(i) = 9.4125; t(i) = 4.2500; i=i+1 190c4762a1bSJed Brown y(i) = 7.7250; t(i) = 4.7500; i=i+1 191c4762a1bSJed Brown y(i) = 7.3500; t(i) = 5.2500; i=i+1 192c4762a1bSJed Brown y(i) = 8.0250; t(i) = 5.7500; i=i+1 193c4762a1bSJed Brown y(i) = 90.6000; t(i) = 0.5000; i=i+1 194c4762a1bSJed Brown y(i) = 76.9000; t(i) = 0.6250; i=i+1 195c4762a1bSJed Brown y(i) = 71.6000; t(i) = 0.7500; i=i+1 196c4762a1bSJed Brown y(i) = 63.6000; t(i) = 0.8750; i=i+1 197c4762a1bSJed Brown y(i) = 54.0000; t(i) = 1.0000; i=i+1 198c4762a1bSJed Brown y(i) = 39.2000; t(i) = 1.2500; i=i+1 199c4762a1bSJed Brown y(i) = 29.3000; t(i) = 1.7500; i=i+1 200c4762a1bSJed Brown y(i) = 21.4000; t(i) = 2.2500; i=i+1 201c4762a1bSJed Brown y(i) = 29.1750; t(i) = 1.7500; i=i+1 202c4762a1bSJed Brown y(i) = 22.1250; t(i) = 2.2500; i=i+1 203c4762a1bSJed Brown y(i) = 17.5125; t(i) = 2.7500; i=i+1 204c4762a1bSJed Brown y(i) = 14.2500; t(i) = 3.2500; i=i+1 205c4762a1bSJed Brown y(i) = 9.4500; t(i) = 3.7500; i=i+1 206c4762a1bSJed Brown y(i) = 9.1500; t(i) = 4.2500; i=i+1 207c4762a1bSJed Brown y(i) = 7.9125; t(i) = 4.7500; i=i+1 208c4762a1bSJed Brown y(i) = 8.4750; t(i) = 5.2500; i=i+1 209c4762a1bSJed Brown y(i) = 6.1125; t(i) = 5.7500; i=i+1 210c4762a1bSJed Brown y(i) = 80.0000; t(i) = 0.5000; i=i+1 211c4762a1bSJed Brown y(i) = 79.0000; t(i) = 0.6250; i=i+1 212c4762a1bSJed Brown y(i) = 63.8000; t(i) = 0.7500; i=i+1 213c4762a1bSJed Brown y(i) = 57.2000; t(i) = 0.8750; i=i+1 214c4762a1bSJed Brown y(i) = 53.2000; t(i) = 1.0000; i=i+1 215c4762a1bSJed Brown y(i) = 42.5000; t(i) = 1.2500; i=i+1 216c4762a1bSJed Brown y(i) = 26.8000; t(i) = 1.7500; i=i+1 217c4762a1bSJed Brown y(i) = 20.4000; t(i) = 2.2500; i=i+1 218c4762a1bSJed Brown y(i) = 26.8500; t(i) = 1.7500; i=i+1 219c4762a1bSJed Brown y(i) = 21.0000; t(i) = 2.2500; i=i+1 220c4762a1bSJed Brown y(i) = 16.4625; t(i) = 2.7500; i=i+1 221c4762a1bSJed Brown y(i) = 12.5250; t(i) = 3.2500; i=i+1 222c4762a1bSJed Brown y(i) = 10.5375; t(i) = 3.7500; i=i+1 223c4762a1bSJed Brown y(i) = 8.5875; t(i) = 4.2500; i=i+1 224c4762a1bSJed Brown y(i) = 7.1250; t(i) = 4.7500; i=i+1 225c4762a1bSJed Brown y(i) = 6.1125; t(i) = 5.2500; i=i+1 226c4762a1bSJed Brown y(i) = 5.9625; t(i) = 5.7500; i=i+1 227c4762a1bSJed Brown y(i) = 74.1000; t(i) = 0.5000; i=i+1 228c4762a1bSJed Brown y(i) = 67.3000; t(i) = 0.6250; i=i+1 229c4762a1bSJed Brown y(i) = 60.8000; t(i) = 0.7500; i=i+1 230c4762a1bSJed Brown y(i) = 55.5000; t(i) = 0.8750; i=i+1 231c4762a1bSJed Brown y(i) = 50.3000; t(i) = 1.0000; i=i+1 232c4762a1bSJed Brown y(i) = 41.0000; t(i) = 1.2500; i=i+1 233c4762a1bSJed Brown y(i) = 29.4000; t(i) = 1.7500; i=i+1 234c4762a1bSJed Brown y(i) = 20.4000; t(i) = 2.2500; i=i+1 235c4762a1bSJed Brown y(i) = 29.3625; t(i) = 1.7500; i=i+1 236c4762a1bSJed Brown y(i) = 21.1500; t(i) = 2.2500; i=i+1 237c4762a1bSJed Brown y(i) = 16.7625; t(i) = 2.7500; i=i+1 238c4762a1bSJed Brown y(i) = 13.2000; t(i) = 3.2500; i=i+1 239c4762a1bSJed Brown y(i) = 10.8750; t(i) = 3.7500; i=i+1 240c4762a1bSJed Brown y(i) = 8.1750; t(i) = 4.2500; i=i+1 241c4762a1bSJed Brown y(i) = 7.3500; t(i) = 4.7500; i=i+1 242c4762a1bSJed Brown y(i) = 5.9625; t(i) = 5.2500; i=i+1 243c4762a1bSJed Brown y(i) = 5.6250; t(i) = 5.7500; i=i+1 244c4762a1bSJed Brown y(i) = 81.5000; t(i) = .5000; i=i+1 245c4762a1bSJed Brown y(i) = 62.4000; t(i) = .7500; i=i+1 246c4762a1bSJed Brown y(i) = 32.5000; t(i) = 1.5000; i=i+1 247c4762a1bSJed Brown y(i) = 12.4100; t(i) = 3.0000; i=i+1 248c4762a1bSJed Brown y(i) = 13.1200; t(i) = 3.0000; i=i+1 249c4762a1bSJed Brown y(i) = 15.5600; t(i) = 3.0000; i=i+1 250c4762a1bSJed Brown y(i) = 5.6300; t(i) = 6.0000; i=i+1 251c4762a1bSJed Brown y(i) = 78.0000; t(i) = .5000; i=i+1 252c4762a1bSJed Brown y(i) = 59.9000; t(i) = .7500; i=i+1 253c4762a1bSJed Brown y(i) = 33.2000; t(i) = 1.5000; i=i+1 254c4762a1bSJed Brown y(i) = 13.8400; t(i) = 3.0000; i=i+1 255c4762a1bSJed Brown y(i) = 12.7500; t(i) = 3.0000; i=i+1 256c4762a1bSJed Brown y(i) = 14.6200; t(i) = 3.0000; i=i+1 257c4762a1bSJed Brown y(i) = 3.9400; t(i) = 6.0000; i=i+1 258c4762a1bSJed Brown y(i) = 76.8000; t(i) = .5000; i=i+1 259c4762a1bSJed Brown y(i) = 61.0000; t(i) = .7500; i=i+1 260c4762a1bSJed Brown y(i) = 32.9000; t(i) = 1.5000; i=i+1 261c4762a1bSJed Brown y(i) = 13.8700; t(i) = 3.0000; i=i+1 262c4762a1bSJed Brown y(i) = 11.8100; t(i) = 3.0000; i=i+1 263c4762a1bSJed Brown y(i) = 13.3100; t(i) = 3.0000; i=i+1 264c4762a1bSJed Brown y(i) = 5.4400; t(i) = 6.0000; i=i+1 265c4762a1bSJed Brown y(i) = 78.0000; t(i) = .5000; i=i+1 266c4762a1bSJed Brown y(i) = 63.5000; t(i) = .7500; i=i+1 267c4762a1bSJed Brown y(i) = 33.8000; t(i) = 1.5000; i=i+1 268c4762a1bSJed Brown y(i) = 12.5600; t(i) = 3.0000; i=i+1 269c4762a1bSJed Brown y(i) = 5.6300; t(i) = 6.0000; i=i+1 270c4762a1bSJed Brown y(i) = 12.7500; t(i) = 3.0000; i=i+1 271c4762a1bSJed Brown y(i) = 13.1200; t(i) = 3.0000; i=i+1 272c4762a1bSJed Brown y(i) = 5.4400; t(i) = 6.0000; i=i+1 273c4762a1bSJed Brown y(i) = 76.8000; t(i) = .5000; i=i+1 274c4762a1bSJed Brown y(i) = 60.0000; t(i) = .7500; i=i+1 275c4762a1bSJed Brown y(i) = 47.8000; t(i) = 1.0000; i=i+1 276c4762a1bSJed Brown y(i) = 32.0000; t(i) = 1.5000; i=i+1 277c4762a1bSJed Brown y(i) = 22.2000; t(i) = 2.0000; i=i+1 278c4762a1bSJed Brown y(i) = 22.5700; t(i) = 2.0000; i=i+1 279c4762a1bSJed Brown y(i) = 18.8200; t(i) = 2.5000; i=i+1 280c4762a1bSJed Brown y(i) = 13.9500; t(i) = 3.0000; i=i+1 281c4762a1bSJed Brown y(i) = 11.2500; t(i) = 4.0000; i=i+1 282c4762a1bSJed Brown y(i) = 9.0000; t(i) = 5.0000; i=i+1 283c4762a1bSJed Brown y(i) = 6.6700; t(i) = 6.0000; i=i+1 284c4762a1bSJed Brown y(i) = 75.8000; t(i) = .5000; i=i+1 285c4762a1bSJed Brown y(i) = 62.0000; t(i) = .7500; i=i+1 286c4762a1bSJed Brown y(i) = 48.8000; t(i) = 1.0000; i=i+1 287c4762a1bSJed Brown y(i) = 35.2000; t(i) = 1.5000; i=i+1 288c4762a1bSJed Brown y(i) = 20.0000; t(i) = 2.0000; i=i+1 289c4762a1bSJed Brown y(i) = 20.3200; t(i) = 2.0000; i=i+1 290c4762a1bSJed Brown y(i) = 19.3100; t(i) = 2.5000; i=i+1 291c4762a1bSJed Brown y(i) = 12.7500; t(i) = 3.0000; i=i+1 292c4762a1bSJed Brown y(i) = 10.4200; t(i) = 4.0000; i=i+1 293c4762a1bSJed Brown y(i) = 7.3100; t(i) = 5.0000; i=i+1 294c4762a1bSJed Brown y(i) = 7.4200; t(i) = 6.0000; i=i+1 295c4762a1bSJed Brown y(i) = 70.5000; t(i) = .5000; i=i+1 296c4762a1bSJed Brown y(i) = 59.5000; t(i) = .7500; i=i+1 297c4762a1bSJed Brown y(i) = 48.5000; t(i) = 1.0000; i=i+1 298c4762a1bSJed Brown y(i) = 35.8000; t(i) = 1.5000; i=i+1 299c4762a1bSJed Brown y(i) = 21.0000; t(i) = 2.0000; i=i+1 300c4762a1bSJed Brown y(i) = 21.6700; t(i) = 2.0000; i=i+1 301c4762a1bSJed Brown y(i) = 21.0000; t(i) = 2.5000; i=i+1 302c4762a1bSJed Brown y(i) = 15.6400; t(i) = 3.0000; i=i+1 303c4762a1bSJed Brown y(i) = 8.1700; t(i) = 4.0000; i=i+1 304c4762a1bSJed Brown y(i) = 8.5500; t(i) = 5.0000; i=i+1 305c4762a1bSJed Brown y(i) = 10.1200; t(i) = 6.0000; i=i+1 306c4762a1bSJed Brown y(i) = 78.0000; t(i) = .5000; i=i+1 307c4762a1bSJed Brown y(i) = 66.0000; t(i) = .6250; i=i+1 308c4762a1bSJed Brown y(i) = 62.0000; t(i) = .7500; i=i+1 309c4762a1bSJed Brown y(i) = 58.0000; t(i) = .8750; i=i+1 310c4762a1bSJed Brown y(i) = 47.7000; t(i) = 1.0000; i=i+1 311c4762a1bSJed Brown y(i) = 37.8000; t(i) = 1.2500; i=i+1 312c4762a1bSJed Brown y(i) = 20.2000; t(i) = 2.2500; i=i+1 313c4762a1bSJed Brown y(i) = 21.0700; t(i) = 2.2500; i=i+1 314c4762a1bSJed Brown y(i) = 13.8700; t(i) = 2.7500; i=i+1 315c4762a1bSJed Brown y(i) = 9.6700; t(i) = 3.2500; i=i+1 316c4762a1bSJed Brown y(i) = 7.7600; t(i) = 3.7500; i=i+1 317c4762a1bSJed Brown y(i) = 5.4400; t(i) = 4.2500; i=i+1 318c4762a1bSJed Brown y(i) = 4.8700; t(i) = 4.7500; i=i+1 319c4762a1bSJed Brown y(i) = 4.0100; t(i) = 5.2500; i=i+1 320c4762a1bSJed Brown y(i) = 3.7500; t(i) = 5.7500; i=i+1 321c4762a1bSJed Brown y(i) = 24.1900; t(i) = 3.0000; i=i+1 322c4762a1bSJed Brown y(i) = 25.7600; t(i) = 3.0000; i=i+1 323c4762a1bSJed Brown y(i) = 18.0700; t(i) = 3.0000; i=i+1 324c4762a1bSJed Brown y(i) = 11.8100; t(i) = 3.0000; i=i+1 325c4762a1bSJed Brown y(i) = 12.0700; t(i) = 3.0000; i=i+1 326c4762a1bSJed Brown y(i) = 16.1200; t(i) = 3.0000; i=i+1 327c4762a1bSJed Brown y(i) = 70.8000; t(i) = .5000; i=i+1 328c4762a1bSJed Brown y(i) = 54.7000; t(i) = .7500; i=i+1 329c4762a1bSJed Brown y(i) = 48.0000; t(i) = 1.0000; i=i+1 330c4762a1bSJed Brown y(i) = 39.8000; t(i) = 1.5000; i=i+1 331c4762a1bSJed Brown y(i) = 29.8000; t(i) = 2.0000; i=i+1 332c4762a1bSJed Brown y(i) = 23.7000; t(i) = 2.5000; i=i+1 333c4762a1bSJed Brown y(i) = 29.6200; t(i) = 2.0000; i=i+1 334c4762a1bSJed Brown y(i) = 23.8100; t(i) = 2.5000; i=i+1 335c4762a1bSJed Brown y(i) = 17.7000; t(i) = 3.0000; i=i+1 336c4762a1bSJed Brown y(i) = 11.5500; t(i) = 4.0000; i=i+1 337c4762a1bSJed Brown y(i) = 12.0700; t(i) = 5.0000; i=i+1 338c4762a1bSJed Brown y(i) = 8.7400; t(i) = 6.0000; i=i+1 339c4762a1bSJed Brown y(i) = 80.7000; t(i) = .5000; i=i+1 340c4762a1bSJed Brown y(i) = 61.3000; t(i) = .7500; i=i+1 341c4762a1bSJed Brown y(i) = 47.5000; t(i) = 1.0000; i=i+1 342c4762a1bSJed Brown y(i) = 29.0000; t(i) = 1.5000; i=i+1 343c4762a1bSJed Brown y(i) = 24.0000; t(i) = 2.0000; i=i+1 344c4762a1bSJed Brown y(i) = 17.7000; t(i) = 2.5000; i=i+1 345c4762a1bSJed Brown y(i) = 24.5600; t(i) = 2.0000; i=i+1 346c4762a1bSJed Brown y(i) = 18.6700; t(i) = 2.5000; i=i+1 347c4762a1bSJed Brown y(i) = 16.2400; t(i) = 3.0000; i=i+1 348c4762a1bSJed Brown y(i) = 8.7400; t(i) = 4.0000; i=i+1 349c4762a1bSJed Brown y(i) = 7.8700; t(i) = 5.0000; i=i+1 350c4762a1bSJed Brown y(i) = 8.5100; t(i) = 6.0000; i=i+1 351c4762a1bSJed Brown y(i) = 66.7000; t(i) = .5000; i=i+1 352c4762a1bSJed Brown y(i) = 59.2000; t(i) = .7500; i=i+1 353c4762a1bSJed Brown y(i) = 40.8000; t(i) = 1.0000; i=i+1 354c4762a1bSJed Brown y(i) = 30.7000; t(i) = 1.5000; i=i+1 355c4762a1bSJed Brown y(i) = 25.7000; t(i) = 2.0000; i=i+1 356c4762a1bSJed Brown y(i) = 16.3000; t(i) = 2.5000; i=i+1 357c4762a1bSJed Brown y(i) = 25.9900; t(i) = 2.0000; i=i+1 358c4762a1bSJed Brown y(i) = 16.9500; t(i) = 2.5000; i=i+1 359c4762a1bSJed Brown y(i) = 13.3500; t(i) = 3.0000; i=i+1 360c4762a1bSJed Brown y(i) = 8.6200; t(i) = 4.0000; i=i+1 361c4762a1bSJed Brown y(i) = 7.2000; t(i) = 5.0000; i=i+1 362c4762a1bSJed Brown y(i) = 6.6400; t(i) = 6.0000; i=i+1 363c4762a1bSJed Brown y(i) = 13.6900; t(i) = 3.0000; i=i+1 364c4762a1bSJed Brown y(i) = 81.0000; t(i) = .5000; i=i+1 365c4762a1bSJed Brown y(i) = 64.5000; t(i) = .7500; i=i+1 366c4762a1bSJed Brown y(i) = 35.5000; t(i) = 1.5000; i=i+1 367c4762a1bSJed Brown y(i) = 13.3100; t(i) = 3.0000; i=i+1 368c4762a1bSJed Brown y(i) = 4.8700; t(i) = 6.0000; i=i+1 369c4762a1bSJed Brown y(i) = 12.9400; t(i) = 3.0000; i=i+1 370c4762a1bSJed Brown y(i) = 5.0600; t(i) = 6.0000; i=i+1 371c4762a1bSJed Brown y(i) = 15.1900; t(i) = 3.0000; i=i+1 372c4762a1bSJed Brown y(i) = 14.6200; t(i) = 3.0000; i=i+1 373c4762a1bSJed Brown y(i) = 15.6400; t(i) = 3.0000; i=i+1 374c4762a1bSJed Brown y(i) = 25.5000; t(i) = 1.7500; i=i+1 375c4762a1bSJed Brown y(i) = 25.9500; t(i) = 1.7500; i=i+1 376c4762a1bSJed Brown y(i) = 81.7000; t(i) = .5000; i=i+1 377c4762a1bSJed Brown y(i) = 61.6000; t(i) = .7500; i=i+1 378c4762a1bSJed Brown y(i) = 29.8000; t(i) = 1.7500; i=i+1 379c4762a1bSJed Brown y(i) = 29.8100; t(i) = 1.7500; i=i+1 380c4762a1bSJed Brown y(i) = 17.1700; t(i) = 2.7500; i=i+1 381c4762a1bSJed Brown y(i) = 10.3900; t(i) = 3.7500; i=i+1 382c4762a1bSJed Brown y(i) = 28.4000; t(i) = 1.7500; i=i+1 383c4762a1bSJed Brown y(i) = 28.6900; t(i) = 1.7500; i=i+1 384c4762a1bSJed Brown y(i) = 81.3000; t(i) = .5000; i=i+1 385c4762a1bSJed Brown y(i) = 60.9000; t(i) = .7500; i=i+1 386c4762a1bSJed Brown y(i) = 16.6500; t(i) = 2.7500; i=i+1 387c4762a1bSJed Brown y(i) = 10.0500; t(i) = 3.7500; i=i+1 388c4762a1bSJed Brown y(i) = 28.9000; t(i) = 1.7500; i=i+1 389c4762a1bSJed Brown y(i) = 28.9500; t(i) = 1.7500; i=i+1 390c4762a1bSJed Brown 391c4762a1bSJed Brown return 392c4762a1bSJed Brown end 393c4762a1bSJed Brown 394c4762a1bSJed Brown subroutine TaskWorker(ierr) 395c4762a1bSJed Brown#include "chwirut2f.h" 396c4762a1bSJed Brown 397c4762a1bSJed Brown PetscErrorCode ierr 39817a42bb7SSatish Balay PetscReal x(n),f(1) 399c4762a1bSJed Brown PetscMPIInt tag 400c4762a1bSJed Brown PetscInt index 401c4762a1bSJed Brown PetscMPIInt status(MPI_STATUS_SIZE) 402c4762a1bSJed Brown 403c4762a1bSJed Brown tag = IDLE_TAG 404c4762a1bSJed Brown f = 0.0 4059dddd249SSatish Balay ! Send check-in message to rank-0 406*d8606c27SBarry Smith PetscCallMPI(MPI_Send(f,one,MPIU_SCALAR,zero,IDLE_TAG,PETSC_COMM_WORLD,ierr)) 407c4762a1bSJed Brown do while (tag .ne. DIE_TAG) 408*d8606c27SBarry Smith PetscCallMPI(MPI_Recv(x,nn,MPIU_SCALAR,zero,MPI_ANY_TAG,PETSC_COMM_WORLD,status,ierr)) 409c4762a1bSJed Brown tag = status(MPI_TAG) 410c4762a1bSJed Brown if (tag .eq. IDLE_TAG) then 411*d8606c27SBarry Smith PetscCallMPI(MPI_Send(f,one,MPIU_SCALAR,zero,IDLE_TAG,PETSC_COMM_WORLD,ierr)) 412c4762a1bSJed Brown else if (tag .ne. DIE_TAG) then 413c4762a1bSJed Brown index = tag 414c4762a1bSJed Brown ! Compute local part of residual 415*d8606c27SBarry Smith PetscCall(RunSimulation(x,index,f(1),ierr)) 416c4762a1bSJed Brown 4179dddd249SSatish Balay ! Return residual to rank-0 418*d8606c27SBarry Smith PetscCallMPI(MPI_Send(f,one,MPIU_SCALAR,zero,tag,PETSC_COMM_WORLD,ierr)) 419c4762a1bSJed Brown end if 420c4762a1bSJed Brown enddo 421c4762a1bSJed Brown ierr = 0 422c4762a1bSJed Brown return 423c4762a1bSJed Brown end 424c4762a1bSJed Brown 425c4762a1bSJed Brown subroutine RunSimulation(x,i,f,ierr) 426c4762a1bSJed Brown#include "chwirut2f.h" 427c4762a1bSJed Brown 428c4762a1bSJed Brown PetscReal x(n),f 429c4762a1bSJed Brown PetscInt i 430c4762a1bSJed Brown PetscErrorCode ierr 431c4762a1bSJed Brown f = y(i) - exp(-x(1)*t(i))/(x(2)+x(3)*t(i)) 432c4762a1bSJed Brown ierr = 0 433c4762a1bSJed Brown return 434c4762a1bSJed Brown end 435c4762a1bSJed Brown 436c4762a1bSJed Brown subroutine StopWorkers(ierr) 437c4762a1bSJed Brown#include "chwirut2f.h" 438c4762a1bSJed Brown 439c4762a1bSJed Brown integer checkedin 440c4762a1bSJed Brown PetscMPIInt status(MPI_STATUS_SIZE) 441c4762a1bSJed Brown PetscMPIInt source 44217a42bb7SSatish Balay PetscReal f(1),x(n) 443c4762a1bSJed Brown PetscErrorCode ierr 444c4762a1bSJed Brown PetscInt i 445c4762a1bSJed Brown 446c4762a1bSJed Brown checkedin=0 447c4762a1bSJed Brown do while (checkedin .lt. size-1) 448*d8606c27SBarry Smith PetscCallMPI(MPI_Recv(f,one,MPIU_SCALAR,MPI_ANY_SOURCE,MPI_ANY_TAG,PETSC_COMM_WORLD,status,ierr)) 449c4762a1bSJed Brown checkedin=checkedin+1 450c4762a1bSJed Brown source = status(MPI_SOURCE) 451c4762a1bSJed Brown do i=1,n 452c4762a1bSJed Brown x(i) = 0.0 453c4762a1bSJed Brown enddo 454*d8606c27SBarry Smith PetscCallMPI(MPI_Send(x,nn,MPIU_SCALAR,source,DIE_TAG,PETSC_COMM_WORLD,ierr)) 455c4762a1bSJed Brown enddo 456c4762a1bSJed Brown ierr = 0 457c4762a1bSJed Brown return 458c4762a1bSJed Brown end 459c4762a1bSJed Brown 460c4762a1bSJed Brown!/*TEST 461c4762a1bSJed Brown! 462c4762a1bSJed Brown! build: 463c4762a1bSJed Brown! requires: !complex 464c4762a1bSJed Brown! 465c4762a1bSJed Brown! test: 466c4762a1bSJed Brown! nsize: 3 467c4762a1bSJed Brown! args: -tao_smonitor -tao_max_it 100 -tao_type pounders -tao_gatol 1.e-5 468c4762a1bSJed Brown! requires: !single 469c4762a1bSJed Brown! 470c4762a1bSJed Brown! 471c4762a1bSJed Brown!TEST*/ 472