SUBROUTINE PDEONE(T, U, UDOT, NPDE, NPTS) PDE 10 DIMENSION U(NPDE,NPTS), UDOT(NPDE,NPTS) C PDEONE IS AN INTERFACE SUBROUTINE WHICH USES CENTERED DIF- C FERENCE APPROXIMATIONS TO CONVERT ONE-DIMENSIONAL SYSTEMS C OF PARTIAL DIFFERENTIAL EQUATIONS INTO A SYSTEM OF ORDINARY C DIFFERENTIAL EQUATIONS, UDOT = F(T,X,U). THIS ROUTINE IS C INTENDED TO BE USED WITH A ROBUST ODE INTEGRATOR. C INPUT.. C NPDE = NUMBER OF PARTIAL DIFFERENTIAL EQUATIONS. C NPTS = NUMBER OF SPATIAL GRID POINTS. C T = CURRENT VALUE OF TIME. C U = AN NPDE BY NPTS ARRAY CONTAINING THE COMPUTED C SOLUTION AT TIME T. C OUTPUT.. C UDOT = AN NPDE BY NPTS ARRAY CONTAINING THE RIGHT HAND C SIDE OF THE RESULTING SYSTEM OF ODE*S, F(T,X,U), C OBTAINED BY DISCRETIZING THE GIVEN PDE*S. C THE USER MUST INSERT A DIMENSION STATEMENT OF THE FOLLOW- C ING FORM.. C DIMENSION DVAL(**,**,2),UX(**),UAVG(**),ALPHA(**), C * BETA(**),GAMMA(**) C THE SYMBOLS ** DENOTE THE ACTUAL NUMERICAL VALUE OF NPDE C FOR THE PROBLEM BEING SOLVED. C COMMON BLOCK MESH CONTAINS THE USER SPECIFIED SPATIAL C GRID POINTS. C COMMON BLOCK COORD CONTAINS 0,1, OR 2 DEPENDING ON WHETHER C THE PROBLEM IS IN CARTESIAN, CYLINDRICAL, OR SPHERICAL C COORDINATES, RESPECTIVELY. COMMON /MESH/ X(1) COMMON /COORD/ ICORD ICORD1 = ICORD + 1 C UPDATE THE LEFT BOUNDARY VALUES CALL BNDRY(T, X(1), U, ALPHA, BETA, GAMMA, NPDE) ITEST = 0 DXI = 1./(X(2)-X(1)) DO 10 K=1,NPDE IF (BETA(K).NE.0.0) GO TO 10 U(K,1) = GAMMA(K)/ALPHA(K) ITEST = ITEST + 1 10 CONTINUE IF (ITEST.EQ.NPDE) GO TO 50 IF (ITEST.EQ.0) GO TO 20 CALL BNDRY(T, X(1), U, ALPHA, BETA, GAMMA, NPDE) C EVALUATE D COEFFICIENTS AT THE LEFT BOUNDARY 20 CALL D(T, X(1), U, DVAL, NPDE) C FORM APPROXIMATIONS TO DU/DX AT THE LEFT BOUNDARY DO 40 K=1,NPDE IF (BETA(K).NE.0.0) GO TO 30 UX(K) = DXI*(U(K,2)-U(K,1)) GO TO 40 30 UX(K) = (GAMMA(K)-ALPHA(K)*U(K,1))/BETA(K) 40 CONTINUE C EVALUATE U-AVERAGE IN THE FIRST INTERVAL 50 DO 60 K=1,NPDE UAVG(K) = .5*(U(K,2)+U(K,1)) 60 CONTINUE C EVALUATE D COEFFICIENTS IN THE FIRST INTERVAL XAVGR = .5*(X(2)+X(1)) CALL D(T, XAVGR, UAVG, DVAL(1,1,2), NPDE) DXIL = 1. DXIR = DXI IF (ICORD.EQ.0) GO TO 70 DXIL = X(1)**ICORD DXIR = DXIR*XAVGR**ICORD C EVALUATE DUXX AT THE LEFT BOUNDARY 70 IF (ITEST.EQ.NPDE) GO TO 100 DXIC = FLOAT(ICORD1)/(XAVGR**ICORD1-X(1)**ICORD1) DO 90 L=1,NPDE DO 80 K=1,NPDE DVAL(K,L,1) = DXIC*(DVAL(K,L,2)*(U(L,2)-U(L,1))* * DXIR-DVAL(K,L,1)*UX(L)*DXIL) 80 CONTINUE 90 CONTINUE C EVALUATE RIGHTHAND SIDE OF PDE*S AT THE LEFT BOUNDARY CALL F(T, X(1), U, UX, DVAL, UDOT, NPDE) C SET UDOT = 0 FOR KNOWN LEFT BOUNDARY VALUES 100 DO 110 K=1,NPDE IF (BETA(K).EQ.0.0) UDOT(K,1) = 0.0 110 CONTINUE C UPDATE THE RIGHT BOUNDARY VALUES CALL BNDRY(T, X(NPTS), U(1,NPTS), ALPHA, BETA, GAMMA, NPDE) ITEST = 0 DO 120 K=1,NPDE IF (BETA(K).NE.0.0) GO TO 120 U(K,NPTS) = GAMMA(K)/ALPHA(K) ITEST = ITEST + 1 120 CONTINUE IBCK = 1 IFWD = 2 ILIM = NPTS - 1 C MAIN LOOP TO FORM ORDINARY DIFFERENTIAL EQUATIONS AT THE C GRID POINTS DO 160 I=2,ILIM K = IBCK IBCK = IFWD IFWD = K XAVGL = XAVGR XAVGR = .5*(X(I+1)+X(I)) DXI = 1./(X(I+1)-X(I-1)) DXIL = DXIR DXIR = 1./(X(I+1)-X(I)) IF (ICORD.NE.0) DXIR = DXIR*XAVGR**ICORD DXIC = FLOAT(ICORD1)/(XAVGR**ICORD1-XAVGL**ICORD1) C EVALUATE DU/DX AND U-AVERAGE AT THE I-TH GRID POINT AND C INTERVAL RESPECTIVELY DO 130 K=1,NPDE UX(K) = DXI*(U(K,I+1)-U(K,I-1)) UAVG(K) = .5*(U(K,I+1)+U(K,I)) 130 CONTINUE C EVALUATE D COEFFICIENTS IN THE I-TH INTERVAL CALL D(T, XAVGR, UAVG, DVAL(1,1,IFWD), NPDE) C EVALUATE DUXX AT THE I-TH GRID POINT DO 150 L=1,NPDE DO 140 K=1,NPDE DVAL(K,L,IBCK) = (DVAL(K,L,IFWD)*(U(L,I+1)-U(L,I))* * DXIR-DVAL(K,L,IBCK)*(U(L,I)-U(L,I-1))*DXIL)*DXIC 140 CONTINUE 150 CONTINUE C EVALUATE RIGHTHAND SIDE OF PDE*S AT THE I-TH GRID POINT CALL F(T, X(I), U(1,I), UX, DVAL(1,1,IBCK), UDOT(1,I), NPDE) 160 CONTINUE C FINISH UPDATING THE RIGHT BOUNDARY IF NECESSARY IF (ITEST.EQ.NPDE) GO TO 220 IF (ITEST.EQ.0) GO TO 170 CALL BNDRY(T, X(NPTS), U(1,NPTS), ALPHA, BETA, GAMMA, NPDE) C EVALUATE D COEFFICIENTS AT THE RIGHT BOUNDARY 170 CALL D(T, X(NPTS), U(1,NPTS), DVAL(1,1,IBCK), NPDE) C FORM APPROXIMATIONS TO DU/DX AT THE RIGHT BOUNDARY DXI = 1./(X(NPTS)-X(ILIM)) DO 190 K=1,NPDE IF (BETA(K).NE.0.0) GO TO 180 UX(K) = DXI*(U(K,NPTS)-U(K,ILIM)) GO TO 190 180 UX(K) = (GAMMA(K)-ALPHA(K)*U(K,NPTS))/BETA(K) 190 CONTINUE DXIL = DXIR DXIR = 1. IF (ICORD.NE.0) DXIR = X(NPTS)**ICORD DXIC = FLOAT(ICORD1)/(X(NPTS)**ICORD1-XAVGR**ICORD1) C EVALUATE DUXX AT THE RIGHT BOUNDARY DO 210 L=1,NPDE DO 200 K=1,NPDE DVAL(K,L,IBCK) = DXIC*(DVAL(K,L,IBCK)*UX(L)*DXIR-DVAL(K,L, * IFWD)*(U(L,NPTS)-U(L,ILIM))*DXIL) 200 CONTINUE 210 CONTINUE C EVALUATE RIGHTHAND SIDE OF PDE*S AT THE RIGHT BOUNDARY CALL F(T, X(NPTS), U(1,NPTS), UX, DVAL(1,1,IBCK), * UDOT(1,NPTS), NPDE) C SET UDOT = 0 FOR KNOWN RIGHT BOUNDARY VALUES 220 DO 230 K=1,NPDE IF (BETA(K).EQ.0.0) UDOT(K,NPTS) = 0.0 230 CONTINUE RETURN END .