C $Header: /u/gcmpack/MITgcm/pkg/autodiff/autodiff_readparms.F,v 1.13 2017/08/09 15:23:39 mlosch Exp $ C $Name: $ #include "AUTODIFF_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP 0 C !ROUTINE: AUTODIFF_READPARMS C !INTERFACE: SUBROUTINE AUTODIFF_READPARMS( myThid ) C !DESCRIPTION: C Initialize AUTODIFF variables and constants. C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "AUTODIFF_PARAMS.h" C !INPUT PARAMETERS: INTEGER myThid CEOP #ifdef ALLOW_AUTODIFF C !LOCAL VARIABLES: C msgBuf :: Informational/error message buffer C iUnit :: Work variable for IO unit number CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER iUnit INTEGER errCount NAMELIST //AUTODIFF_PARM01 & dumpAdVarExch, mon_AdVarExch, & dumpAdByRec, & useKPPinAdMode, useGGL90inAdMode, & useGMRediInAdMode, useSALT_PLUMEinAdMode, & useSEAICEinAdMode, useSmoothCorrel2DinAdMode, & inAdExact, SEAICEapproxLevInAd, viscFacInAd, & SEAICEuseFREEDRIFTswitchInAd, SEAICEuseDYNAMICSswitchInAd IF ( .NOT.useAUTODIFF ) THEN C- pkg AUTODIFF is not used _BEGIN_MASTER(myThid) C- Track pkg activation status: C print a (weak) warning if data.autodiff is found CALL PACKAGES_UNUSED_MSG( 'useAUTODIFF', ' ', ' ' ) _END_MASTER(myThid) RETURN ENDIF _BEGIN_MASTER(myThid) errCount = 0 C-- Default values for AUTODIFF dumpAdVarExch = 2 mon_AdVarExch = 2 C- to recover old ad-monitor & ad-dump behaviour: c dumpAdVarExch = 1 c mon_AdVarExch = 0 C-- default : write one file per record dumpAdByRec = .FALSE. useKPPinAdMode = .TRUE. useGMRediInAdMode = .TRUE. useSEAICEinAdMode = .TRUE. useGGL90inAdMode = .TRUE. useSALT_PLUMEinAdMode = .TRUE. inAdExact = .TRUE. SEAICEapproxLevInAd = 0 viscFacInAd = 1. _d 0 C-- pkg/seaice related switches SEAICEuseFREEDRIFTswitchInAd = .FALSE. SEAICEuseDYNAMICSswitchInAd = .FALSE. useSmoothCorrel2DinAdMode = .TRUE. WRITE(msgBuf,'(A)') 'AUTODIFF_READPARMS: opening data.autodiff' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) CALL OPEN_COPY_DATA_FILE( I 'data.autodiff', 'AUTODIFF_READPARMS', O iUnit, I myThid ) C Read parameters from open data file READ(UNIT=iUnit,NML=AUTODIFF_PARM01) WRITE(msgBuf,'(A)') & 'AUTODIFF_READPARMS: finished reading data.autodiff' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C Close the open data file #ifdef SINGLE_DISK_IO CLOSE(iUnit) #else CLOSE(iUnit,STATUS='DELETE') #endif /* SINGLE_DISK_IO */ C-- Flag for approximate adjoint IF ( inAdExact ) THEN inAdTrue = .FALSE. inAdFalse = .FALSE. ELSE inAdTrue = .TRUE. inAdFalse = .FALSE. ENDIF inAdMode = .FALSE. C-- packages which can be switched off in adjoint mode (approximate adjoint): C store value of usePKG as it will be reset in S/R ADAUTODIFF_INADMODE_UNSET useKPPinFwdMode = useKPP useGMRediInFwdMode = useGMRedi useSEAICEinFwdMode = useSEAICE useGGL90inFwdMode = useGGL90 useSALT_PLUMEinFwdMode = useSALT_PLUME C store value of usePKG as it will be set in S/R ADAUTODIFF_INADMODE_SET useKPPinAdMode = useKPPinAdMode .AND. useKPP useGMRediInAdMode = useGMRediInAdMode .AND. useGMRedi useSEAICEinAdMode = useSEAICEinAdMode .AND. useSEAICE useGGL90inAdMode = useGGL90inAdMode .AND. useGGL90 useSALT_PLUMEinAdMode = useSALT_PLUMEinAdMode .AND. useSALT_PLUME #ifdef ALLOW_SEAICE c level of approximation in seaice thermodynamics adjoint if (useSEAICEinFwdMode.AND.(.NOT.useSEAICEinAdMode)) & SEAICEapproxLevInAd=MIN(SEAICEapproxLevInAd,0) if (useSEAICEinAdMode) & SEAICEapproxLevInAd=MAX(SEAICEapproxLevInAd,0) #endif C-- Print out some kee parameters : WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// AUTODIFF parameters :' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) CALL WRITE_0D_L( inAdExact, INDEX_NONE, & 'inAdExact =', ' /* get an exact adjoint (no approximation) */') CALL WRITE_0D_L( useKPPinAdMode, INDEX_NONE, & 'useKPPinAdMode =', ' /* use KPP in adjoint mode */') CALL WRITE_0D_L( useGMRediInAdMode, INDEX_NONE, & 'useGMRediInAdMode =', ' /* use GMRedi in adjoint mode */') CALL WRITE_0D_L( useSEAICEinAdMode, INDEX_NONE, & 'useSEAICEinAdMode =', ' /* use SEAICE in adjoint mode */') CALL WRITE_0D_L( useGGL90inAdMode, INDEX_NONE, & 'useGGL90inAdMode =', ' /* use GGL90 in adjoint mode */') CALL WRITE_0D_L( useSALT_PLUMEinAdMode, INDEX_NONE, & 'useSALT_PLUMEinAdMode =', & ' /* use SALT_PLUME in adjoint mode */') #ifdef ALLOW_SEAICE CALL WRITE_0D_L( SEAICEuseDYNAMICSswitchInAd, INDEX_NONE, & 'SEAICEuseDYNAMICSswitchInAd =', & ' /* switch On/Off SEAICE Dyn in AD mode */') CALL WRITE_0D_L( SEAICEuseFREEDRIFTswitchInAd, INDEX_NONE, & 'SEAICEuseFREEDRIFTswitchInAd=', & ' /* switch On/Off Free-Drift in AD mode */') CALL WRITE_0D_I( SEAICEapproxLevInAd, INDEX_NONE, & 'SEAICEapproxLevInAd =', & ' /* -1:SEAICE_FAKE, >0:other adjoint approximation */') #endif /* ALLOW_SEAICE */ CALL WRITE_0D_I( dumpAdVarExch, INDEX_NONE, & 'dumpAdVarExch =', ' /* control adexch before dumpinp */') CALL WRITE_0D_I( mon_AdVarExch, INDEX_NONE, & 'mon_AdVarExch =', ' /* control adexch before monitor */') CALL WRITE_0D_RL( viscFacInAd, INDEX_NONE, & 'viscFacInAd =', ' /* viscosity factor for adjoint */') WRITE(msgBuf,'(A)') ' ' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C-- Check parameters : #ifdef ALLOW_SEAICE IF ( SEAICEuseFREEDRIFTswitchInAd .AND. .NOT.useSEAICE ) THEN WRITE(msgBuf,'(2A)') 'AUTODIFF_READPARMS: ', & 'SEAICEuseFREEDRIFTswitchInAd not usable without useSEAICE' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( SEAICEuseDYNAMICSswitchInAd .AND. .NOT.useSEAICE ) THEN WRITE(msgBuf,'(2A)') 'AUTODIFF_READPARMS: ', & 'SEAICEuseDYNAMICSswitchInAd not usable without useSEAICE' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #else /* ALLOW_SEAICE */ SEAICEuseFREEDRIFTswitchInAd = .FALSE. SEAICEuseDYNAMICSswitchInAd = .FALSE. #endif /* ALLOW_SEAICE */ IF ( errCount.GE.1 ) THEN WRITE(msgBuf,'(A,I3,A)') & 'AUTODIFF_READPARMS: detected', errCount,' fatal error(s)' CALL PRINT_ERROR( msgBuf, myThid ) CALL ALL_PROC_DIE( 0 ) STOP 'ABNORMAL END: S/R AUTODIFF_READPARMS' ENDIF _END_MASTER(myThid) C-- Everyone else must wait for the parameters to be loaded _BARRIER #endif /* ALLOW_AUTODIFF */ RETURN END