|
C******************************************************************* C** C** v e m e 0 2 e x m 1 0 : C** C** System of three nonlinear patrial differential equations of C** the Navier-Stokes type on a 3-dimensional domain. The examples C** demonstrates the usage of restarts. The mesh is read from a C** VECFEM input file. C** C** by L. Grosz Karlsruhe, Mar. 1995 C** C** C******************************************************************* C** C** The problem is a system of three partial differential C** equations, which are a simplification of the Navier-Stokes C** equations (it is assummed that the pressure is constant). C** The domain is the 3-dimensional cube with length pi. An all C** boundaries Neuman boundary conditions are prescribed and for C** all components a Dirichlet condition at the origin is set. C** Using the notations in equation the problem is given by C** the functional equation: C** C** Dirichlet conditions: C** u1=0 C** u2=0 C** u3=0 C** C** linear functional equation: F{u}(v)=0 C** C** with F{u}(v)= C** volume{v1x1*u1x1+v1x2*u1x2+v1x3*u1x3+ C** Re*v1*(u1*u1x1+u2*u1x2+u3*u1x3-f1) C** + v2x1*u2x1+v2x2*u2x2+v2x3*u2x3+ C** Re*v2*(u1*u2x1+u2*u2x2+u3*u2x3-f2) C** + v3x1*u3x1+v3x2*u3x2+v3x3*u3x3+ C** Re*v3*(u1*u3x1+u2*u3x2+u3*u3x3-f3)} C** + area{v1*g1+v2*g2+v3*g3} C** C** The functions f and g are selected so that C** C** u1=cos(x1)*sin(x2)*sin(x3) C** u2=sin(x1)*cos(x2)*sin(x3) C** u3=sin(x1)*sin(x2)*cos(x3) C** C** is the exact solution of this problem. The real value Re C** controls numerical behaviour of the problem. For increasing C** values of Re the problem will get ill-posed and you have to C** expect that the calculation fails. C** C** The mesh is read from the vecfem input file wurf.vem. C** It uses hexahedron elements of order 2 for the subdivision C** of the cube and quadrilateral elements for its boundary. C** C**----------------------------------------------------------------- C** PROGRAM VEMEXM C** C**----------------------------------------------------------------- C** IMPLICIT NONE include 'bytes.h' C** C**----------------------------------------------------------------- C** C** some parameters which may be chanced: C** C** MAXNG = maximal number of groups C** INPUT = name of the vecfem input file C** STORE = total storage of process in Mbytes. C** INTEGER NPROC,MAXNG,STORE CHARACTER*80 INPUT PARAMETER (MAXNG=5, & INPUT='wurf.vem', & STORE=65) C** C**----------------------------------------------------------------- C** C** the parameters are explained in mesh. C** INTEGER NK,DIM,MESH,LOUT PARAMETER (NK=3, & DIM=3, & MESH=500, & LOUT=6) C** C**----------------------------------------------------------------- C** C** the length of the array for the mesh are set: C** INTEGER LU,LNODN,LNOD,LNOPRM,LNEK,LRPARM,LIPARM, & LDNOD,LIDPRM,LRDPRM,LIVEM,LRVEM,LLVEM,LBIG PARAMETER (LU =30 000, & LNODN =10 000, & LNOD =30 000, & LNOPRM=1, & LNEK=64 000, & LIPARM=6800, & LRPARM=1, & LDNOD =6, & LIDPRM=3, & LRDPRM=3, & LIVEM =MESH+800+LU+LDNOD/2, & LLVEM =500, & LRVEM =60+2*LU) C** C**----------------------------------------------------------------- C** C** RBIG should be as large as possible: the available C** storage STORE is reduced by all allocated array. C** the remaining storage is reserved for RBIG. C** PARAMETER ( LBIG=(STORE * 1 000 000)/IREAL & - (3*LU+LNOD+LNOPRM+LRPARM+LRDPRM) & - (LIVEM+LNODN+LNEK+LIPARM+LDNOD+LIDPRM)/RPI ) C** C**----------------------------------------------------------------- C** C** variables and arrays : C** -------------------- C** DOUBLE PRECISION T,NOD(LNOD),NOPARM(LNOPRM),RPARM(LRPARM), & RDPARM(LRDPRM),RBIG(LBIG),U(LU),RVEM(LRVEM), & EEST(LU),ERRG(LU),NRMERR(NK) INTEGER IVEM(LIVEM),NODNUM(LNODN),NEK(LNEK), & IPARM(LIPARM),DNOD(LDNOD),IDPARM(LIDPRM), & IBIG(RPI*LBIG) LOGICAL MASKL(NK,NK,MAXNG),MASKF(NK,MAXNG),LVEM(LLVEM) C*** INTEGER MYPROC,INFO,OUTFLG,GINFO,GINFO1,CLASS,NGROUP,G, & J,I,RUNIT,ERR CHARACTER*80 NAME,RFILE LOGICAL RSTRT DOUBLE PRECISION RE C*** EXTERNAL VEM630,VEM500 EXTERNAL DUMMY,USRFU,USERF,USERC,USERB C** C**----------------------------------------------------------------- C** C** The equivalence of RBIG and IBIG is very important : C** EQUIVALENCE (RBIG,IBIG) C** C**----------------------------------------------------------------- C** C** The common block PROP transports the real value RE to the C** subroutines: C** COMMON/PROP/RE RE=0.0 C** C**----------------------------------------------------------------- C** C** get task ids : C** NAME='a.out' CALL COMBGN(IVEM(200),MYPROC,LIVEM-203,IVEM(204),NAME,INFO) IF (INFO.NE.0) GOTO 9999 IVEM(201)=MYPROC IVEM(202)=0 IVEM(203)=IVEM(204) C** C**----------------------------------------------------------------- C** C** a protocol is printed only on process 1 : C** IF (MYPROC.EQ.1) THEN OUTFLG=1 ELSE OUTFLG=0 ENDIF C** C**----------------------------------------------------------------- C** C**** read the restart file : C** --------------------- C** WRITE(RFILE,9000) MYPROC RUNIT=99 9000 FORMAT('restart.p',I3.3) C** C**** If the restart file 'restart.p<NPROC>' exists, the file C** is read an the calculation is continued with veme02: C** INQUIRE(FILE=RFILE,EXIST=RSTRT) IF (RSTRT) THEN OPEN(UNIT=RUNIT,FILE=RFILE,STATUS= 'UNKNOWN', & FORM='UNFORMATTED') CALL VEM680 (RUNIT,LU,U,LIVEM,IVEM,LLVEM,LVEM,LRVEM,RVEM, & LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM, & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG, & LOUT,ERR) CLOSE(RUNIT) IF (ERR.GT.0) GOTO 9999 GOTO 5000 ENDIF C** C**----------------------------------------------------------------- C** C**** the parameters are copied into IVEM : C** ----------------------------------- C** IVEM(1)=MESH IVEM(MESH+ 2)=NK IVEM(MESH+ 3)=DIM C** C**----------------------------------------------------------------- C** C**** read the mesh from a universal file : C** ----------------------------------- C** IVEM(27)=LOUT IVEM(28)=OUTFLG IVEM(29)=9 IF (MYPROC.EQ.1) OPEN(9,FILE=INPUT,STATUS= 'UNKNOWN', & FORM='FORMATTED') CALL VEMU02 (LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM, & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG) CLOSE(9) IF (IVEM(2).NE.0) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** print mesh on processor 1 C** ------------------------- C** IVEM(20)=LOUT IVEM(21)=0000*OUTFLG IVEM(22)=2 CALL VEMU01(LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM, & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM, & LNODN,NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG) IF (IVEM(2).NE.0) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** distribute mesh : C** ---------------- C** IVEM(80)=LOUT IVEM(81)=OUTFLG IVEM(51)=2 CALL VEMDIS (LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM , & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM, & LNODN,NODNUM,LNOD,NOD,LNOPRM,NOPARM, & LBIG,RBIG,IBIG) IF (IVEM(2).NE.0) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** set masks : C** --------- C** NGROUP=IVEM(IVEM(1)+4) GINFO=IVEM(IVEM(1)+21)+IVEM(1) GINFO1=IVEM(IVEM(1)+22) DO 400 G=1,NGROUP DO 410 I=1,NK MASKF(I,G)=.FALSE. DO 410 J=1,NK 410 MASKL(I,J,G)=.FALSE. CLASS=IVEM(GINFO+GINFO1*(G-1)+3) IF (CLASS.EQ.DIM) THEN DO 420 I=1,NK MASKF(I,G)=.TRUE. DO 420 J=1,NK 420 MASKL(I,J,G)=.TRUE. ELSEIF (CLASS.EQ.DIM-1) THEN DO 430 I=1,NK 430 MASKF(I,G)=.TRUE. ENDIF 400 CONTINUE C** C**----------------------------------------------------------------- C** C**** call of VECFEM : C** -------------- C** 5000 CONTINUE OPEN(10,FORM='UNFORMATTED',STATUS='SCRATCH') OPEN(11,FORM='UNFORMATTED',STATUS='SCRATCH') OPEN(12,FORM='UNFORMATTED',STATUS='SCRATCH') LVEM(1)=.FALSE. LVEM(4)=.FALSE. LVEM(5)=.FALSE. LVEM(6)=.TRUE. LVEM(7)=.TRUE. LVEM(8)=.TRUE. LVEM(9)=.FALSE. LVEM(10)=.TRUE. LVEM(11)=.FALSE. RVEM(1)=10. RVEM(3)=1.D-2 RVEM(10)=1.D-8 IVEM(3)=0 IVEM(10)=10 IVEM(11)=11 IVEM(12)=12 IVEM(40)=LOUT IVEM(41)=50*OUTFLG IVEM(45)=500 IVEM(46)=0 IVEM(60)=0 IVEM(70)=10 IVEM(71)=11 IVEM(72)=10 000 CALL VEME02 (T,LU,U,EEST,LIVEM,IVEM,LLVEM,LVEM,LRVEM,RVEM, & LNEK, NEK ,LRPARM ,RPARM ,LIPARM ,IPARM , & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG, & MASKL,MASKF,USERB,USRFU,USERF,VEM500,VEM630) IF (IVEM(2).GT.1) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** save the mash files for restart : C** ------------------------------- C** IF (IVEM(2).EQ.1) THEN OPEN(UNIT=RUNIT,FILE=RFILE,FORM='UNFORMATTED') CALL VEM681 (RUNIT,LU,U,LIVEM,IVEM,LLVEM,LVEM,LRVEM,RVEM, & LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM, & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG, & LOUT,ERR) CLOSE(RUNIT) GOTO 9999 ENDIF C** C**----------------------------------------------------------------- C** C**** compute the error on the geometrical nodes : C** ------------------------------------------ C** IVEM(4)=30 IVEM(30)=LOUT IVEM(31)=OUTFLG*0 IVEM(32)=LNODN IVEM(33)=NK CALL VEMU05 (T,LU,ERRG,LU,U,LIVEM,IVEM, & LNEK, NEK ,LRPARM ,RPARM ,LIPARM ,IPARM , & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG, & USERC) IF (IVEM(2).NE.0) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** print the error and its norm : C** ---------------------------- C** IVEM(23)=LOUT IVEM(24)=OUTFLG IVEM(25)=IVEM(32) IVEM(26)=IVEM(33) CALL VEMU13 (LU,ERRG,NRMERR,LIVEM,IVEM, & LNEK, NEK ,LRPARM ,RPARM ,LIPARM ,IPARM , & LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN, & NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG) IF (IVEM(2).NE.0) GOTO 9999 C** C**----------------------------------------------------------------- C** C**** end of calculation C** ------------------ C** 9999 CALL COMEND(IVEM(200),INFO) E N D SUBROUTINE USERB(T,COMPU,RHS, & NRSDP,RSDPRM,NRVDP,RVDP1,RVDPRM, & NISDP,ISDPRM,NIVDP,IVDP1,IVDPRM, & NDC,DIM,X,NOP,NOPARM,B) C** C******************************************************************* C** C** the routine USERB sets the Dirichlet boundary conditions, C** see userb. here the solution is set to zero, which is C** the exact solution at the origin. C** C******************************************************************* C** INTEGER COMPU,RHS,NRSDP,NRVDP,RVDP1,NISDP,NIVDP,IVDP1, & NDC,DIM,NOP DOUBLE PRECISION T,RSDPRM(NRSDP),RVDPRM(RVDP1,NRVDP), & X(NDC,DIM),NOPARM(NDC,NOP),B(NDC) INTEGER ISDPRM(NISDP),IVDPRM(IVDP1,NIVDP) C** C**----------------------------------------------------------------- C** INTEGER Z C** C**----------------------------------------------------------------- C** C**** start of calculation : C** -------------------- C** DO 10 Z=1,NDC B(Z) = 0 10 CONTINUE C** C**----------------------------------------------------------------- C** C**** end of calculation C** ------------------ C** R E T U R N C**---end of USERB-------------------------------------------------- E N D SUBROUTINE USRFU(T,GROUP,CLASS,COMPV,COMPU,LAST, & NELIS,L,DIM,X,TAU,NK,U,DUDX, & LT,UT,DUTDX,NOP,NOPARM,DNOPDX, & NRSP,RSPARM,NRVP,RVP1,RVPARM, & NISP,ISPARM,NIVP,IVP1,IVPARM, & F1UX,F1U,F0UX,F0U) C** C******************************************************************* C** C** the routine USRFU sets the Frechet derivative of the linear C** form F, see usrfu: C** C******************************************************************* C** INTEGER GROUP,CLASS,COMPV,COMPU,LAST,NELIS,L,LT, & DIM,NK,NOP,NRSP,RVP1,NRVP,NISP,IVP1,NIVP DOUBLE PRECISION T,X(L,DIM),TAU(L,DIM,CLASS),U(L,NK),UT(LT,NK), & DUDX(L,NK,CLASS),DUTDX(LT,NK,CLASS), & NOPARM(L,NOP),DNOPDX(L,NOP,CLASS), & RSPARM(NRSP),RVPARM(RVP1,NRVP), & F1UX(L,CLASS,CLASS),F1U(L,CLASS),F0UX(L,CLASS), & F0U(L) INTEGER ISPARM(NISP),IVPARM(IVP1,NIVP) C** C**----------------------------------------------------------------- C** INTEGER Z DOUBLE PRECISION RE COMMON/PROP/RE C** C**----------------------------------------------------------------- C** C**** start of calculation : C** --------------------- C** IF ((COMPV.EQ.1).AND.(COMPU.EQ.1).AND.(CLASS.EQ.3)) THEN DO 4 Z=1,NELIS F0U(Z)=RE*DUDX(Z,1,1) F0UX(Z,1)=RE*U(Z,1) F0UX(Z,2)=RE*U(Z,2) F0UX(Z,3)=RE*U(Z,3) F1UX(Z,1,1)=1 F1UX(Z,2,2)=1 F1UX(Z,3,3)=1 4 CONTINUE ENDIF IF ((COMPV.EQ.1).AND.(COMPU.EQ.2).AND.(CLASS.EQ.3)) THEN DO 8 Z=1,NELIS F0U(Z)=RE*DUDX(Z,1,2) 8 CONTINUE ENDIF IF ((COMPV.EQ.1).AND.(COMPU.EQ.3).AND.(CLASS.EQ.3)) THEN DO 12 Z=1,NELIS F0U(Z)=RE*DUDX(Z,1,3) 12 CONTINUE ENDIF IF ((COMPV.EQ.2).AND.(COMPU.EQ.1).AND.(CLASS.EQ.3)) THEN DO 16 Z=1,NELIS F0U(Z)=RE*DUDX(Z,2,1) 16 CONTINUE ENDIF IF ((COMPV.EQ.2).AND.(COMPU.EQ.2).AND.(CLASS.EQ.3)) THEN DO 20 Z=1,NELIS F0U(Z)=RE*DUDX(Z,2,2) F0UX(Z,1)=RE*U(Z,1) F0UX(Z,2)=RE*U(Z,2) F0UX(Z,3)=RE*U(Z,3) F1UX(Z,1,1)=1 F1UX(Z,2,2)=1 F1UX(Z,3,3)=1 20 CONTINUE ENDIF IF ((COMPV.EQ.2).AND.(COMPU.EQ.3).AND.(CLASS.EQ.3)) THEN DO 24 Z=1,NELIS F0U(Z)=RE*DUDX(Z,2,3) 24 CONTINUE ENDIF IF ((COMPV.EQ.3).AND.(COMPU.EQ.1).AND.(CLASS.EQ.3)) THEN DO 28 Z=1,NELIS F0U(Z)=RE*DUDX(Z,3,1) 28 CONTINUE ENDIF IF ((COMPV.EQ.3).AND.(COMPU.EQ.2).AND.(CLASS.EQ.3)) THEN DO 32 Z=1,NELIS F0U(Z)=RE*DUDX(Z,3,2) 32 CONTINUE ENDIF IF ((COMPV.EQ.3).AND.(COMPU.EQ.3).AND.(CLASS.EQ.3)) THEN DO 36 Z=1,NELIS F0U(Z)=RE*DUDX(Z,3,3) F0UX(Z,1)=RE*U(Z,1) F0UX(Z,2)=RE*U(Z,2) F0UX(Z,3)=RE*U(Z,3) F1UX(Z,1,1)=1 F1UX(Z,2,2)=1 F1UX(Z,3,3)=1 36 CONTINUE ENDIF C** C**----------------------------------------------------------------- C** C**** end of calculation C** ------------------ C** R E T U R N C**---end of USRFU-------------------------------------------------- E N D SUBROUTINE USERF (T,GROUP,CLASS,COMPV,RHS,LAST, & NELIS,L,DIM,X,TAU,NK,U,DUDX, & LT,UT,DUTDX,NOP,NOPARM,DNOPDX, & NRSP,RSPARM,NRVP,RVP1,RVPARM, & NISP,ISPARM,NIVP,IVP1,IVPARM, & F1,F0) C** C******************************************************************* C** C** the routine USERF sets the coefficients of the linear form F, C** see userf. C** C******************************************************************* C** INTEGER GROUP,CLASS,COMPV,RHS,LAST,NELIS,L,LT,DIM,NK,NOP, & NRSP,RVP1,NRVP,NISP,IVP1,NIVP DOUBLE PRECISION T,X(L,DIM),TAU(L,DIM,CLASS),U(L,NK),UT(LT,NK), & DUDX(L,NK,CLASS),DUTDX(LT,NK,CLASS), & NOPARM(L,NOP),DNOPDX(L,NOP,CLASS), & RSPARM(NRSP),RVPARM(RVP1,NRVP), & F1(L,CLASS),F0(L) INTEGER ISPARM(NISP),IVPARM(IVP1,NIVP) C** C**----------------------------------------------------------------- C** INTEGER Z DOUBLE PRECISION RE COMMON/PROP/RE C** C**----------------------------------------------------------------- C** C**** start of calculation : C** -------------------- C** C** the coefficients for the volume integration : C** IF (CLASS.EQ.3) THEN IF (COMPV.EQ.1) THEN DO 4 Z=1,NELIS F1(Z,1)=DUDX(Z,1,1) F1(Z,2)=DUDX(Z,1,2) F1(Z,3)=DUDX(Z,1,3) F0(Z)=RE*(U(Z,1)*DUDX(Z,1,1)+ & U(Z,2)*DUDX(Z,1,2)+U(Z,3)*DUDX(Z,1,3)) & +RE*COS(X(Z,1))*SIN(X(Z,1)) & -2*RE*COS(X(Z,1))*SIN(X(Z,1))*COS(X(Z,3))**2 & -2*RE*COS(X(Z,1))*SIN(X(Z,1))*COS(X(Z,2))**2 & +3*RE*COS(X(Z,1))*SIN(X(Z,1))*COS(X(Z,2))**2*COS(X(Z,3))**2 & -3*COS(X(Z,1))*SIN(X(Z,2))*SIN(X(Z,3)) 4 CONTINUE ENDIF IF (COMPV.EQ.2) THEN DO 8 Z=1,NELIS F1(Z,1)=DUDX(Z,2,1) F1(Z,2)=DUDX(Z,2,2) F1(Z,3)=DUDX(Z,2,3) F0(Z)=RE*(U(Z,1)*DUDX(Z,2,1)+ & U(Z,2)*DUDX(Z,2,2)+U(Z,3)*DUDX(Z,2,3)) & +RE*COS(X(Z,2))*SIN(X(Z,2)) & -2*RE*COS(X(Z,1))**2*SIN(X(Z,2))*COS(X(Z,2)) & -2*RE*COS(X(Z,2))*SIN(X(Z,2))*COS(X(Z,3))**2 & +3*RE*COS(X(Z,1))**2*SIN(X(Z,2))*COS(X(Z,2))*COS(X(Z,3))**2 & -3*SIN(X(Z,1))*COS(X(Z,2))*SIN(X(Z,3)) 8 CONTINUE ENDIF IF (COMPV.EQ.3) THEN DO 12 Z=1,NELIS F1(Z,1)=DUDX(Z,3,1) F1(Z,2)=DUDX(Z,3,2) F1(Z,3)=DUDX(Z,3,3) F0(Z)=RE*(U(Z,1)*DUDX(Z,3,1)+ & U(Z,2)*DUDX(Z,3,2)+U(Z,3)*DUDX(Z,3,3)) & +RE*COS(X(Z,3))*SIN(X(Z,3)) & -2*RE*COS(X(Z,1))**2*SIN(X(Z,3))*COS(X(Z,3)) & -2*RE*COS(X(Z,2))**2*SIN(X(Z,3))*COS(X(Z,3)) & +3*RE*COS(X(Z,1))**2*SIN(X(Z,3))*COS(X(Z,3))*COS(X(Z,2))**2 & -3*SIN(X(Z,1))*SIN(X(Z,2))*COS(X(Z,3)) 12 CONTINUE ENDIF ENDIF C** C**----------------------------------------------------------------- C** C** the coefficients for the area integration : C** IF (CLASS.EQ.2) THEN IF (COMPV.EQ.1) THEN DO 3 Z=1,NELIS IF (X(Z,2).LT.1.D-2) F0(Z)=COS(X(Z,1))*SIN(X(Z,3)) IF (X(Z,2).GT.3.14) F0(Z)=COS(X(Z,1))*SIN(X(Z,3)) IF (X(Z,3).LT.1.D-2) F0(Z)=COS(X(Z,1))*SIN(X(Z,2)) IF (X(Z,3).GT.3.14) F0(Z)=COS(X(Z,1))*SIN(X(Z,2)) 3 CONTINUE ENDIF IF (COMPV.EQ.2) THEN DO 7 Z=1,NELIS IF (X(Z,1).LT.1.D-2) F0(Z)=COS(X(Z,2))*SIN(X(Z,3)) IF (X(Z,1).GT.3.14) F0(Z)=COS(X(Z,2))*SIN(X(Z,3)) IF (X(Z,3).LT.1.D-2) F0(Z)=SIN(X(Z,1))*COS(X(Z,2)) IF (X(Z,3).GT.3.14) F0(Z)=SIN(X(Z,1))*COS(X(Z,2)) 7 CONTINUE ENDIF IF (COMPV.EQ.3) THEN DO 11 Z=1,NELIS IF (X(Z,1).LT.1.D-2) F0(Z)=SIN(X(Z,2))*COS(X(Z,3)) IF (X(Z,1).GT.3.14) F0(Z)=SIN(X(Z,2))*COS(X(Z,3)) IF (X(Z,2).LT.1.D-2) F0(Z)=SIN(X(Z,1))*COS(X(Z,3)) IF (X(Z,2).GT.3.14) F0(Z)=SIN(X(Z,1))*COS(X(Z,3)) 11 CONTINUE ENDIF ENDIF C** C**----------------------------------------------------------------- C** C**** end of calculation C** ------------------ C** R E T U R N C**---end of USERF------------------------------------------------- E N D SUBROUTINE USERC(T,GROUP,LAST,NELIS, & NRSP,RSPARM,NRVP,RVP1,RVPARM, & NISP,ISPARM,NIVP,IVP1,IVPARM, & L,DIM,X,NK,U,DUDX,NOP,NOPARM,DNOPDX,N,CU) C** C******************************************************************* C** C** the routine USERC computes in this case the error of the C** computed solution, see userc. C** C******************************************************************* C** INTEGER GROUP,LAST,NELIS,L,DIM,NK,N, & NRSP,RVP1,NRVP,NISP,IVP1,NIVP,NOP DOUBLE PRECISION T,X(L,DIM),U(L,NK),DUDX(L,NK,DIM), & RSPARM(NRSP),RVPARM(RVP1,NRVP), & NOPARM(L,NOP),DNOPDX(L,NOP,DIM),CU(L,N) INTEGER ISPARM(NISP),IVPARM(IVP1,NIVP) C** C**----------------------------------------------------------------- C** INTEGER Z C** C**----------------------------------------------------------------- C** C**** start of calculation : C** -------------------- C** DO 10 Z=1,NELIS CU(Z,1) = ABS( U(Z,1) - COS(X(Z,1))*SIN(X(Z,2))*SIN(X(Z,3))) CU(Z,2) = ABS( U(Z,2) - SIN(X(Z,1))*COS(X(Z,2))*SIN(X(Z,3))) CU(Z,3) = ABS( U(Z,3) - SIN(X(Z,1))*SIN(X(Z,2))*COS(X(Z,3))) 10 CONTINUE C** C**----------------------------------------------------------------- C** C**** end of calculation C** ------------------ C** R E T U R N C**---end of USERC-------------------------------------------------- E N D |