3961 lines
118 KiB
Fortran
3961 lines
118 KiB
Fortran
! $Id: rpmares_adj_mod.f,v 1.1 2009/09/09 06:12:55 daven Exp $
|
|
MODULE RPMARES_ADJ_MOD
|
|
!
|
|
!******************************************************************************
|
|
! Module RPMARES_ADJ_MOD is used to call the aerosol thermo adjoint
|
|
! subroutines (dkh, 09/08/09)
|
|
!
|
|
! Module Routines:
|
|
! ============================================================================
|
|
! (1 ) DO_RPMARES_ADJ : Driver which calls adjoint thermo routines
|
|
! (2 ) adactcof : adjoint of actcof
|
|
! (3 ) adawater : adjoint of awater
|
|
! (4 ) adrpmares_11 : adjoint of rpmares exit=11
|
|
! (5 ) adrpmares_12 : adjoint of rpmares exit=12
|
|
! (6 ) adrpmares_2 : adjoint of rpmares exit=2
|
|
! (7 ) adrpmares_3 : adjoint of rpmares exit=3
|
|
! (8 ) adrpmares_4 : adjoint of rpmares exit=4
|
|
! (9 ) adrpmares_6 : adjoint of rpmares exit=6 (old)
|
|
! (10) adrpmares_7 : adjoint of rpmares exit=7
|
|
! (11) adrpmares_8 : adjoint of rpmares exit=8
|
|
! (12) adcubic : adjoint of cubic
|
|
! (13) adrpmares_6_D5 : adjoint of rpmares exit=6 (correct)
|
|
!
|
|
! GEOS-CHEM modules referenced by chemistry_mod.f
|
|
! ============================================================================
|
|
! (1 ) checkpt_mod : Module w/ routines for checkpointing
|
|
! (2 ) dao_mod : Module containing arrays for DAO met fields
|
|
! (3 ) rpmares_mod : Module w/ routines for aerosol thermodynamics
|
|
! (4 ) tracerid_mod : Module containing pointers to tracers & emissions
|
|
!
|
|
! NOTES:
|
|
! (1 ) Updated to GCv8 (dkh, 09/09/09)
|
|
!
|
|
!******************************************************************************
|
|
!
|
|
IMPLICIT NONE
|
|
|
|
!=================================================================
|
|
! MODULE ROUTINES -- follow below the "CONTAINS" statement
|
|
!=================================================================
|
|
CONTAINS
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE DO_RPMARES_ADJ ( )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine DO_RPMARES_ADJ is the driver for the TAMC generated adjoint of the
|
|
! aerosol thermodynamic routine RPMARES
|
|
! (dkh, 8/27/04, 09/08/09)
|
|
!
|
|
! Passed via checkpoint_mod.f
|
|
! ============================================================================
|
|
!
|
|
! NOTES:
|
|
! (1 ) Add error checking. Add ADJ_NAN, FIRST, ADJ_NAN_COUNT, ADJ_MAX...
|
|
! Check ADJ_STT for NAN and for large increases after calls to adrpmares.
|
|
! Now reference IT_IS_NAN. (dkh, 02/08/05)
|
|
! (2 ) Move paramters NCTOT and NPAR from CMN_ADJ to here. Replace many uses
|
|
! of NADJ with NCTOT. Initialize ADJ_TMP after initializing ADJ_STT_LOCAL.
|
|
! ADJ_STT_LOCAL is now dim = 8, not dim = NOBS, as NOBS may be much larger.
|
|
! Remove IS_DURING_OBSERVATION argument
|
|
! No longer force adjoints in this routine, do it in ???. (dkh, 03/03/05)
|
|
! (3 ) Now the ITS_TIME_FOR_CHEM section uses ADJ_STT [kg], so switch to
|
|
! [ug/m3] for this portion, and switch back at the end. (dkh, 03/10/05)
|
|
! (4 ) Replace the adjoint code for the high ratio case ( NRETURN = 6 ) with
|
|
! improved code that is more accurate and requires less checkpointing.
|
|
! (dkh, 06/01/05)
|
|
! (5 ) Now reference ADJ_CONVERT_UNITS from dao_mod.f (dkh, 11/03/05)
|
|
! (6 ) Udpated to GCv8, renamed from ADJ_AEROSOL to DO_RPMARES_ADJ.
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ADJ_ARRAYS_MOD, ONLY : IFD, JFD, LFD
|
|
USE ADJ_ARRAYS_MOD, ONLY : STT_ADJ
|
|
USE CHECKPT_MOD, ONLY : RP_IN, RP_OUT
|
|
USE DAO_MOD, ONLY : AIRVOL
|
|
USE ERROR_MOD, ONLY : ERROR_STOP, IT_IS_NAN
|
|
USE LOGICAL_ADJ_MOD, ONLY : LPRINTFD
|
|
USE TRACERID_MOD, ONLY : IDTSO4, IDTNH3, IDTNH4, IDTHNO3
|
|
USE TRACERID_MOD, ONLY : IDTNIT
|
|
USE TROPOPAUSE_MOD, ONLY : ITS_IN_THE_STRAT
|
|
|
|
|
|
# include "CMN_SIZE" ! Size params
|
|
|
|
! Parameters
|
|
INTEGER, PARAMETER :: MAX_ALLOWED_NAN = 10
|
|
INTEGER, PARAMETER :: MAX_ALLOWED_EXPLD = 10
|
|
REAL*8, PARAMETER :: MAX_ALLOWED_INCREASE = 10.0D10
|
|
|
|
INTEGER, PARAMETER :: NPAR = 2 ! Number of input variables to RPMARES that are
|
|
! parameters, i.e. temp and rh
|
|
|
|
INTEGER, PARAMETER :: NCTOT = 5 ! Number of input variables to RPMARES that are
|
|
! total concentrations, = NRPIN - NPAR
|
|
|
|
! Local variables
|
|
REAL*8 :: CTOT_P(NCTOT) ! Same size as argument of the ad_rpmares routines
|
|
REAL*8 :: PAR_P(NPAR)
|
|
REAL*8 :: ADJ_STT_LOCAL(8) ! Same size as argument of the ad_rpmares routines
|
|
REAL*8 :: ADJ_CTOT(NCTOT)
|
|
INTEGER :: I, J, L, N
|
|
INTEGER :: NRETURN
|
|
REAL*8 :: ADJ_TMP(NCTOT) ! Temp storage for resetting bad adjs to original value
|
|
REAL*8 :: MAX_ADJ_TMP ! Temp max value used for error checking
|
|
LOGICAL :: ADJ_NAN = .FALSE.
|
|
INTEGER :: ADJ_NAN_COUNT, ADJ_EXPLD_COUNT
|
|
LOGICAL, SAVE :: FIRST = .TRUE.
|
|
REAL*8 :: AVOL
|
|
|
|
!================================================================
|
|
! DO_RPMARES_ADJ begins here!
|
|
!================================================================
|
|
|
|
! Initialize ADJ_NAN_COUNT the first time through
|
|
IF ( FIRST ) THEN
|
|
ADJ_NAN_COUNT = 0
|
|
ADJ_EXPLD_COUNT = 0
|
|
|
|
FIRST = .FALSE.
|
|
ENDIF
|
|
|
|
! Save maximum adjoint for error checking later
|
|
MAX_ADJ_TMP = MAXVAL( ABS(STT_ADJ) )
|
|
|
|
!$OMP PARALLEL DO
|
|
!$OMP+DEFAULT( SHARED )
|
|
!$OMP+PRIVATE( I, J, L, N )
|
|
!$OMP+PRIVATE( CTOT_P, PAR_P, NRETURN, ADJ_STT_LOCAL )
|
|
!$OMP+PRIVATE( ADJ_TMP, ADJ_CTOT )
|
|
!$OMP+PRIVATE( AVOL )
|
|
DO L = 1, LLTROP
|
|
DO J = 1, JJPAR
|
|
DO I = 1, IIPAR
|
|
|
|
! Skip if we are in the stratosphere (bmy, 4/3/08)
|
|
IF ( ITS_IN_THE_STRAT( I, J, L ) ) CYCLE
|
|
|
|
! air volume
|
|
AVOL = AIRVOL(I,J,L)
|
|
|
|
! Load IN from RP_IN
|
|
CTOT_P(:) = RP_IN(I,J,L,1:NCTOT)
|
|
|
|
! Load parameters from RP_IN
|
|
PAR_P(:) = RP_IN(I,J,L,6:7)
|
|
|
|
! Find out where RPMARES exited during the forward run
|
|
NRETURN = RP_OUT(I,J,L,9)
|
|
|
|
|
|
! Initialize the independent and dependent variables to 0
|
|
ADJ_CTOT(:) = 0.D0
|
|
ADJ_STT_LOCAL(:) = 0.D0
|
|
|
|
! Copy current value of ADJ variable to ADJ_STT_LOCAL
|
|
! Always update the local adjoint input to the current adjoint tracer
|
|
! values
|
|
ADJ_STT_LOCAL(3) = STT_ADJ(I,J,L,IDTNIT) * AVOL * 1.d-9
|
|
ADJ_STT_LOCAL(5) = STT_ADJ(I,J,L,IDTNH4) * AVOL * 1.d-9
|
|
ADJ_STT_LOCAL(7) = STT_ADJ(I,J,L,IDTHNO3) * AVOL * 1.d-9
|
|
ADJ_STT_LOCAL(8) = STT_ADJ(I,J,L,IDTNH3) * AVOL * 1.d-9
|
|
! Since thermo doesn't modify total sulfate, don't need to
|
|
! pass it initial adjoint values for SO4 ?
|
|
ADJ_STT_LOCAL(6) = 0d0
|
|
|
|
! The forcing for these species is also zero
|
|
ADJ_STT_LOCAL(1) = 0.d0
|
|
ADJ_STT_LOCAL(2) = 0.d0
|
|
ADJ_STT_LOCAL(4) = 0.d0
|
|
|
|
! Store original values in ADJ_TMP
|
|
ADJ_TMP(1) = STT_ADJ(I,J,L,IDTSO4)
|
|
ADJ_TMP(2) = STT_ADJ(I,J,L,IDTHNO3)
|
|
ADJ_TMP(3) = STT_ADJ(I,J,L,IDTNH3)
|
|
ADJ_TMP(4) = STT_ADJ(I,J,L,IDTNIT)
|
|
ADJ_TMP(5) = STT_ADJ(I,J,L,IDTNH4)
|
|
|
|
IF ( LPRINTFD
|
|
& .and. J == JFD .AND. L == LFD .AND. I == IFD) THEN
|
|
print*, 'before ', CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL
|
|
print*, 'NRETURN = ', NRETURN
|
|
ENDIF
|
|
|
|
!============================================================
|
|
! CALCULATE ADJOINT THERMO
|
|
!
|
|
! The thermodynamic routine is broken into several regimes.
|
|
! The regime from the forward calculation is marked by the
|
|
! NRETURN flag. Use this flag to push the adjoint calculation
|
|
! into the same regime.
|
|
!============================================================
|
|
|
|
IF (NRETURN == 1) THEN
|
|
! the adjoint variables are unchanged in this case
|
|
ADJ_CTOT(:) = ADJ_TMP(:)
|
|
|
|
ELSEIF (NRETURN == 2) THEN
|
|
CALL adrpmares_2( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 3 .OR. NRETURN == 5) THEN
|
|
CALL adrpmares_3( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 4) THEN
|
|
CALL adrpmares_4( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 6) THEN
|
|
CALL adrpmares_6_D5( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 7) THEN
|
|
CALL adrpmares_7( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 8 .OR. NRETURN == 9
|
|
& .OR. NRETURN == 10) THEN
|
|
CALL adrpmares_8( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 11) THEN
|
|
CALL adrpmares_11( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSEIF (NRETURN == 12) THEN
|
|
CALL adrpmares_12( CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL,
|
|
& I, J, L )
|
|
ELSE
|
|
print*, ' NRETURN = ', NRETURN , I, J, L
|
|
CALL ERROR_STOP
|
|
& ('ERROR: NRETURN ill defined ','ADJ_AEROSOL')
|
|
ENDIF
|
|
|
|
IF ( LPRINTFD .AND.
|
|
& J == JFD .AND. L == LFD .AND. I == IFD) THEN
|
|
print*, 'after ', CTOT_P, PAR_P, ADJ_CTOT, ADJ_STT_LOCAL
|
|
ENDIF
|
|
|
|
! Check for NAN.
|
|
DO N = 1, NCTOT
|
|
|
|
IF ( IT_IS_NAN( ADJ_CTOT(N) ) ) THEN
|
|
|
|
! Echo location of NAN (probably leave this commented out
|
|
! unless you are getting lots of ADJ_NAN warnings
|
|
!WRITE(6,*) 'FOUND A NAN AT I,J,L,N = ',I,J,L,N
|
|
|
|
!$OMP CRITICAL
|
|
! Set ADJ_NAN flag so that a warning is echod to screen
|
|
ADJ_NAN = .TRUE.
|
|
!$OMP END CRITICAL
|
|
|
|
! Replace the NAN with the original value and continue
|
|
ADJ_CTOT(N) = ADJ_TMP(N)
|
|
ENDIF
|
|
|
|
ENDDO
|
|
|
|
! Update ADJ_STT array
|
|
STT_ADJ(I,J,L,IDTHNO3) = ADJ_CTOT(2) * 1.d9 / AVOL
|
|
STT_ADJ(I,J,L,IDTNH3) = ADJ_CTOT(3) * 1.d9 / AVOL
|
|
STT_ADJ(I,J,L,IDTNIT) = ADJ_CTOT(4) * 1.d9 / AVOL
|
|
STT_ADJ(I,J,L,IDTNH4) = ADJ_CTOT(5) * 1.d9 / AVOL
|
|
|
|
! Becuase we don't initiate the sulfate adjoint with STT_ADJ,
|
|
! do not overwrite.
|
|
STT_ADJ(I,J,L,IDTSO4) = STT_ADJ(I,J,L,IDTSO4)
|
|
& + ADJ_CTOT(1) * 1.d9 / AVOL
|
|
|
|
ENDDO
|
|
ENDDO
|
|
ENDDO
|
|
!$OMP END PARALLEL DO
|
|
|
|
|
|
! Error checking
|
|
IF ( ADJ_NAN ) THEN
|
|
|
|
! Echo a warning to the screen
|
|
WRITE(6,*)
|
|
& ' *** - WARNING: ADJ_NAN in routine ADJ_AEROSOL'
|
|
|
|
! keep track of how many times NANs have occured
|
|
ADJ_NAN_COUNT = ADJ_NAN_COUNT + 1
|
|
|
|
IF ( ADJ_NAN_COUNT > MAX_ALLOWED_NAN )
|
|
& CALL ERROR_STOP('Too many NANs', 'ADJ_AEROSOL')
|
|
|
|
ENDIF
|
|
|
|
! More error checking: warn of exploding adjoit values, except
|
|
! the first jump up from zero (MAX_ADJ_TMP = 0 first few times)
|
|
IF ( MAXVAL(ABS(STT_ADJ)) > (MAX_ADJ_TMP * MAX_ALLOWED_INCREASE)
|
|
& .AND. ( MAX_ADJ_TMP > 0d0 ) ) THEN
|
|
|
|
WRITE(6,*)' *** - WARNING: EXPLODING adjoints in ADJ_AEROSOL'
|
|
WRITE(6,*)' *** - MAX(ADJ_STT) before = ',MAX_ADJ_TMP
|
|
WRITE(6,*)' *** - MAX(ADJ_STT) after = ',MAXVAL(ABS(STT_ADJ))
|
|
|
|
ADJ_EXPLD_COUNT = ADJ_EXPLD_COUNT + 1
|
|
|
|
IF (ADJ_EXPLD_COUNT > MAX_ALLOWED_EXPLD )
|
|
& CALL ERROR_STOP('Too many exploding adjoints',
|
|
& 'ADJ_AEROSOL, adjoint_mod.f')
|
|
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE DO_RPMARES_ADJ
|
|
!------------------------------------------------------------------------------
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adactcof( cat, an, adcat, adan, adgama )
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
integer nan
|
|
parameter ( nan = 3 )
|
|
integer ncat
|
|
parameter ( ncat = 2 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
common /actcofsv/ pname, xmsg, zm, zp
|
|
character*(16) :: pname = ' driver program name'
|
|
character*(120) :: xmsg = ' '
|
|
real*8 :: zm(nan) = (/2.d0,1.d0,1.d0/)
|
|
real*8 :: zp(ncat) = (/1.d0,1.d0/)
|
|
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
real*8 adan(nan)
|
|
real*8 adcat(ncat)
|
|
real*8 adgama(ncat,nan)
|
|
real*8 an(nan)
|
|
real*8 cat(ncat)
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adbgama(ncat,nan)
|
|
real*8 adf1(nan)
|
|
real*8 adf2(ncat)
|
|
real*8 adfgama
|
|
real*8 adi
|
|
real*8 adlgama0(ncat,nan)
|
|
real*8 adm(ncat,nan)
|
|
real*8 adsri
|
|
real*8 adta
|
|
real*8 adtc
|
|
real*8 adtexpv
|
|
real*8 adtrm
|
|
real*8 adtwoi
|
|
real*8 adtwosri
|
|
real*8 adx(ncat,nan)
|
|
real*8 ady(nan,ncat)
|
|
real*8 adzot1
|
|
real*8 beta0(ncat,nan)
|
|
real*8 beta1(ncat,nan)
|
|
real*8 bgama(ncat,nan)
|
|
real*8 cgama(ncat,nan)
|
|
integer exit
|
|
real*8 f1(nan)
|
|
real*8 f2(ncat)
|
|
real*8 fgama
|
|
real*8 i
|
|
integer ian
|
|
integer icat
|
|
integer ip1
|
|
integer ip2
|
|
real*8 lgama0(ncat,nan)
|
|
real*8 m(ncat,nan)
|
|
real*8 sri
|
|
real*8 ta
|
|
real*8 tb
|
|
real*8 tc
|
|
real*8 texpv
|
|
real*8 trm
|
|
real*8 twoi
|
|
real*8 twosri
|
|
real*8 v1(ncat,nan)
|
|
real*8 v2(ncat,nan)
|
|
real*8 x(ncat,nan)
|
|
real*8 y(nan,ncat)
|
|
real*8 zbar
|
|
real*8 zbar2
|
|
real*8 zot1
|
|
|
|
C==============================================
|
|
C define data
|
|
C==============================================
|
|
data beta0(1,1)/2.98d-2/
|
|
data beta1(1,1)/0.0d0/
|
|
data cgama(1,1)/4.38d-2/
|
|
data beta0(1,2)/1.2556d-1/
|
|
data beta1(1,2)/2.8778d-1/
|
|
data cgama(1,2)/-5.59d-3/
|
|
data beta0(1,3)/2.0651d-1/
|
|
data beta1(1,3)/5.556d-1/
|
|
data cgama(1,3)/0.0d0/
|
|
data beta0(2,1)/4.6465d-2/
|
|
data beta1(2,1)/-0.54196d0/
|
|
data cgama(2,1)/-1.2683d-3/
|
|
data beta0(2,2)/-7.26224d-3/
|
|
data beta1(2,2)/-1.168858d0/
|
|
data cgama(2,2)/3.51217d-5/
|
|
data beta0(2,3)/4.494d-2/
|
|
data beta1(2,3)/2.3594d-1/
|
|
data cgama(2,3)/-2.962d-3/
|
|
data v1(1,1),v2(1,1)/2.0d0,1.0d0/
|
|
data v1(2,1),v2(2,1)/2.0d0,1.0d0/
|
|
data v1(1,2),v2(1,2)/1.0d0,1.0d0/
|
|
data v1(2,2),v2(2,2)/1.0d0,1.0d0/
|
|
data v1(1,3),v2(1,3)/1.0d0,1.0d0/
|
|
data v1(2,3),v2(2,3)/1.0d0,1.0d0/
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
do ip2 = 1, nan
|
|
do ip1 = 1, ncat
|
|
adbgama(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
do ip1 = 1, nan
|
|
adf1(ip1) = 0.
|
|
end do
|
|
do ip1 = 1, ncat
|
|
adf2(ip1) = 0.
|
|
end do
|
|
adfgama = 0.
|
|
adi = 0.
|
|
do ip2 = 1, nan
|
|
do ip1 = 1, ncat
|
|
adlgama0(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
do ip2 = 1, nan
|
|
do ip1 = 1, ncat
|
|
adm(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
adsri = 0.
|
|
adta = 0.
|
|
adtc = 0.
|
|
adtexpv = 0.
|
|
adtrm = 0.
|
|
adtwoi = 0.
|
|
adtwosri = 0.
|
|
do ip2 = 1, nan
|
|
do ip1 = 1, ncat
|
|
adx(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
do ip2 = 1, ncat
|
|
do ip1 = 1, nan
|
|
ady(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
adzot1 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
exit = 0
|
|
if (exit .eq. 0) then
|
|
i = 0.d0
|
|
endif
|
|
do icat = 1, ncat
|
|
if (exit .eq. 0) then
|
|
i = i+cat(icat)*zp(icat)*zp(icat)
|
|
endif
|
|
end do
|
|
do ian = 1, nan
|
|
if (exit .eq. 0) then
|
|
i = i+an(ian)*zm(ian)*zm(ian)
|
|
endif
|
|
end do
|
|
if (exit .eq. 0) then
|
|
i = 0.5d0*i
|
|
endif
|
|
if (i .eq. 0.d0) then
|
|
if (exit .eq. 0) then
|
|
exit = 1
|
|
endif
|
|
endif
|
|
if (exit .eq. 0) then
|
|
sri = sqrt(i)
|
|
twosri = 2.d0*sri
|
|
twoi = 2.d0*i
|
|
texpv = 1.d0-exp(-twosri)*(1.d0+twosri-twoi)
|
|
zot1 = 0.511d0*sri/(1.d0+sri)
|
|
fgama = -(0.392d0*(sri/(1.d0+1.2d0*sri)+2.d0/1.2d0*log(1.d0+
|
|
$1.2d0*sri)))
|
|
do icat = 1, ncat
|
|
do ian = 1, nan
|
|
bgama(icat,ian) = 2.d0*beta0(icat,ian)+2.d0*beta1(icat,ian)/
|
|
$(4.d0*i)*texpv
|
|
m(icat,ian) = (cat(icat)**v1(icat,ian)*an(ian)**v2(icat,ian)
|
|
$)**(1.d0/(v1(icat,ian)+v2(icat,ian)))
|
|
lgama0(icat,ian) = (zp(icat)*zm(ian)*fgama+m(icat,ian)*2.d0*
|
|
$v1(icat,ian)*v2(icat,ian)/(v1(icat,ian)+v2(icat,ian))*bgama(icat,
|
|
$ian)+m(icat,ian)*m(icat,ian)*2.d0*(v1(icat,ian)*v2(icat,ian))**
|
|
$1.5d0/(v1(icat,ian)+v2(icat,ian))*cgama(icat,ian))/2.302585093d0
|
|
end do
|
|
end do
|
|
do ian = 1, nan
|
|
do icat = 1, ncat
|
|
zbar = (zp(icat)+zm(ian))*0.5d0
|
|
zbar2 = zbar*zbar
|
|
y(ian,icat) = zbar2*an(ian)/i
|
|
x(icat,ian) = zbar2*cat(icat)/i
|
|
end do
|
|
end do
|
|
do ian = 1, nan
|
|
f1(ian) = 0.d0
|
|
do icat = 1, ncat
|
|
f1(ian) = f1(ian)+x(icat,ian)*lgama0(icat,ian)+zot1*zp(icat)
|
|
$*zm(ian)*x(icat,ian)
|
|
end do
|
|
end do
|
|
do icat = 1, ncat
|
|
f2(icat) = 0.d0
|
|
do ian = 1, nan
|
|
f2(icat) = f2(icat)+y(ian,icat)*lgama0(icat,ian)+zot1*
|
|
$zp(icat)*zm(ian)*y(ian,icat)
|
|
end do
|
|
end do
|
|
do ian = 1, nan
|
|
adta = 0.
|
|
adtc = 0.
|
|
adtrm = 0.
|
|
do icat = 1, ncat
|
|
adta = 0.
|
|
adtc = 0.
|
|
adtrm = 0.
|
|
ta = -(zot1*zp(icat)*zm(ian))
|
|
tb = zp(icat)*zm(ian)/(zp(icat)+zm(ian))
|
|
tc = f2(icat)/zp(icat)+f1(ian)/zm(ian)
|
|
trm = ta+tb*tc
|
|
if (trm .gt. 30.d0) then
|
|
adgama(icat,ian) = 0.
|
|
else
|
|
adtrm = adtrm+adgama(icat,ian)*10.d0**trm*dlog(10.d0)
|
|
adgama(icat,ian) = 0.
|
|
endif
|
|
adta = adta+adtrm
|
|
adtc = adtc+adtrm*tb
|
|
adtrm = 0.
|
|
adf1(ian) = adf1(ian)+adtc/zm(ian)
|
|
adf2(icat) = adf2(icat)+adtc/zp(icat)
|
|
adtc = 0.
|
|
adzot1 = adzot1-adta*zp(icat)*zm(ian)
|
|
adta = 0.
|
|
end do
|
|
end do
|
|
do icat = 1, ncat
|
|
do ian = 1, nan
|
|
adlgama0(icat,ian) = adlgama0(icat,ian)+adf2(icat)*y(ian,
|
|
$icat)
|
|
ady(ian,icat) = ady(ian,icat)+adf2(icat)*(lgama0(icat,ian)+
|
|
$zot1*zp(icat)*zm(ian))
|
|
adzot1 = adzot1+adf2(icat)*zp(icat)*zm(ian)*y(ian,icat)
|
|
end do
|
|
adf2(icat) = 0.
|
|
end do
|
|
do ian = 1, nan
|
|
do icat = 1, ncat
|
|
adlgama0(icat,ian) = adlgama0(icat,ian)+adf1(ian)*x(icat,
|
|
$ian)
|
|
adx(icat,ian) = adx(icat,ian)+adf1(ian)*(lgama0(icat,ian)+
|
|
$zot1*zp(icat)*zm(ian))
|
|
adzot1 = adzot1+adf1(ian)*zp(icat)*zm(ian)*x(icat,ian)
|
|
end do
|
|
adf1(ian) = 0.
|
|
end do
|
|
do ian = 1, nan
|
|
do icat = 1, ncat
|
|
zbar = (zp(icat)+zm(ian))*0.5d0
|
|
zbar2 = zbar*zbar
|
|
adcat(icat) = adcat(icat)+adx(icat,ian)*(zbar2/i)
|
|
adi = adi-adx(icat,ian)*(zbar2*cat(icat)/(i*i))
|
|
adx(icat,ian) = 0.
|
|
adan(ian) = adan(ian)+ady(ian,icat)*(zbar2/i)
|
|
adi = adi-ady(ian,icat)*(zbar2*an(ian)/(i*i))
|
|
ady(ian,icat) = 0.
|
|
end do
|
|
end do
|
|
do icat = 1, ncat
|
|
do ian = 1, nan
|
|
bgama(icat,ian) = 2.d0*beta0(icat,ian)+2.d0*beta1(icat,ian)/
|
|
$(4.d0*i)*texpv
|
|
m(icat,ian) = (cat(icat)**v1(icat,ian)*an(ian)**v2(icat,ian)
|
|
$)**(1.d0/(v1(icat,ian)+v2(icat,ian)))
|
|
adbgama(icat,ian) = adbgama(icat,ian)+adlgama0(icat,ian)*
|
|
$(m(icat,ian)*(2.d0*v1(icat,ian)*v2(icat,ian)/(v1(icat,ian)+
|
|
$v2(icat,ian)))/2.302585093d0)
|
|
adfgama = adfgama+adlgama0(icat,ian)*(zp(icat)*zm(ian)/
|
|
$2.302585093d0)
|
|
adm(icat,ian) = adm(icat,ian)+adlgama0(icat,ian)*((2.d0*
|
|
$v1(icat,ian)*v2(icat,ian)/(v1(icat,ian)+v2(icat,ian))*bgama(icat,
|
|
$ian)+2*m(icat,ian)*2.d0*(v1(icat,ian)*v2(icat,ian))**1.5d0/
|
|
$(v1(icat,ian)+v2(icat,ian))*cgama(icat,ian))/2.302585093d0)
|
|
adlgama0(icat,ian) = 0.
|
|
|
|
! The next two IF statements added to avoid divide by zero
|
|
! segmentation fault (dkh)
|
|
IF (adm(icat,ian)*cat(icat)**v1(icat,ian)*
|
|
$v2(icat,ian)*an(ian) .NE. 0.D0 .AND.
|
|
$ (cat(icat)**v1(icat,ian)*an(ian)**v2(icat,ian)) .NE. 0.D0)
|
|
$ adan(ian) = adan(ian)+adm(icat,ian)*cat(icat)**v1(icat,ian)*
|
|
$v2(icat,ian)*an(ian)**(v2(icat,ian)-1)*1.d0/(v1(icat,ian)+v2(icat,
|
|
$ian))*(cat(icat)**v1(icat,ian)*an(ian)**v2(icat,ian))**(1.d0/
|
|
$(v1(icat,ian)+v2(icat,ian))-1)
|
|
IF (adm(icat,ian)*v1(icat,ian)*
|
|
$cat(icat) .NE. 0.D0 .AND. (cat(icat)**v1(icat,ian)*an(ian)**
|
|
$v2(icat,ian)) .NE. 0.D0)
|
|
$ adcat(icat) = adcat(icat)+adm(icat,ian)*v1(icat,ian)*
|
|
$cat(icat)**(v1(icat,ian)-1)*an(ian)**v2(icat,ian)*1.d0/(v1(icat,
|
|
$ian)+v2(icat,ian))*(cat(icat)**v1(icat,ian)*an(ian)**v2(icat,ian))
|
|
$**(1.d0/(v1(icat,ian)+v2(icat,ian))-1)
|
|
adm(icat,ian) = 0.
|
|
adi = adi-adbgama(icat,ian)*8*beta1(icat,ian)/(16*i*i)*texpv
|
|
adtexpv = adtexpv+adbgama(icat,ian)*(2.d0*beta1(icat,ian)/
|
|
$(4.d0*i))
|
|
adbgama(icat,ian) = 0.
|
|
end do
|
|
end do
|
|
adsri = adsri-0.392d0*adfgama*(1/(1.d0+1.2d0*sri)-1.2d0*sri/
|
|
$((1.d0+1.2d0*sri)*(1.d0+1.2d0*sri))+2*(1./(1.d0+1.2d0*sri)))
|
|
adfgama = 0.
|
|
adsri = adsri+adzot1*(0.511d0/(1.d0+sri)-0.511d0*sri/((1.d0+sri)
|
|
$*(1.d0+sri)))
|
|
adzot1 = 0.
|
|
adtwoi = adtwoi+adtexpv*exp(-twosri)
|
|
adtwosri = adtwosri-adtexpv*(exp(-twosri)-(1.d0+twosri-twoi)*
|
|
$exp(-twosri))
|
|
adtexpv = 0.
|
|
adi = adi+2*adtwoi
|
|
adtwoi = 0.
|
|
adsri = adsri+2*adtwosri
|
|
adtwosri = 0.
|
|
adi = adi+adsri*(1./(2.*sqrt(i)))
|
|
adsri = 0.
|
|
endif
|
|
exit = 0
|
|
if (i .eq. 0.d0) then
|
|
if (exit .eq. 0) then
|
|
do ian = 1, nan
|
|
do icat = 1, ncat
|
|
adgama(icat,ian) = 0.
|
|
end do
|
|
end do
|
|
endif
|
|
endif
|
|
if (exit .eq. 0) then
|
|
adi = 0.5d0*adi
|
|
endif
|
|
do ian = 1, nan
|
|
if (exit .eq. 0) then
|
|
adan(ian) = adan(ian)+adi*zm(ian)*zm(ian)
|
|
endif
|
|
end do
|
|
do icat = 1, ncat
|
|
if (exit .eq. 0) then
|
|
adcat(icat) = adcat(icat)+adi*zp(icat)*zp(icat)
|
|
endif
|
|
end do
|
|
|
|
end SUBROUTINE ADACTCOF
|
|
!-----------------------------------------------------------------------------
|
|
|
|
subroutine adawater( irhx, mso4, mnh4, mno3, admso4, admnh4,
|
|
$admno3, adwh2o )
|
|
|
|
! Reference other f90 modules
|
|
USE RPMARES_MOD, ONLY : POLY4, POLY6
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.0985d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0636d0 )
|
|
real*8 mw2
|
|
parameter ( mw2 = mwso4+2.d0*mwnh4 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0649d0 )
|
|
real*8 mwano3
|
|
parameter ( mwano3 = mwno3+mwnh4 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
common /awatersv/ c0, c1, c15, c2, kno3, kso4
|
|
real*8 :: c0(4) = (/0.798079d0,-1.574367d0,2.536686d0,-
|
|
$1.735297d0/)
|
|
real*8 :: c1(4) = (/0.9995178d0,-0.7952896d0,0.99683673d0,-
|
|
$1.143874d0/)
|
|
real*8 :: c15(4) = (/1.697092d0,-4.045936d0,5.833688d0,-
|
|
$3.463783d0/)
|
|
real*8 :: c2(4) = (/2.085067d0,-6.024139d0,8.967967d0,-
|
|
$5.002934d0/)
|
|
real*8 :: kno3(6) = (/0.2906d0,6.83665d0,-26.9093d0,46.6983d0,-
|
|
$38.803d0,11.8837d0/)
|
|
real*8 :: kso4(6) = (/2.27515d0,-11.147d0,36.3369d0,-64.2134d0,
|
|
$56.8341d0,-20.0953d0/)
|
|
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
real*8 admnh4
|
|
real*8 admno3
|
|
real*8 admso4
|
|
real*8 adwh2o
|
|
integer irhx
|
|
real*8 mnh4
|
|
real*8 mno3
|
|
real*8 mso4
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adawc
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adx
|
|
real*8 ady
|
|
real*8 ady40
|
|
real*8 adyc
|
|
real*8 aw
|
|
real*8 awc
|
|
integer irh
|
|
real*8 mfs0
|
|
real*8 mfs1
|
|
real*8 mfs15
|
|
real*8 mfsno3
|
|
real*8 mfsso4
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
real*8 x
|
|
real*8 y
|
|
real*8 y0
|
|
real*8 y1
|
|
real*8 y140
|
|
real*8 y15
|
|
real*8 y1540
|
|
real*8 y2
|
|
real*8 y3
|
|
real*8 y40
|
|
real*8 yc
|
|
|
|
!C==============================================
|
|
!C define external procedures and functions
|
|
!C==============================================
|
|
! double precision poly4
|
|
! external poly4
|
|
! double precision poly6
|
|
! external poly6
|
|
!
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adawc = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adx = 0.
|
|
ady = 0.
|
|
ady40 = 0.
|
|
adyc = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
irh = irhx
|
|
irh = max(1,irh)
|
|
irh = min(irh,100)
|
|
aw = dble(irh)/100.d0
|
|
tso4 = max(mso4,0.d0)
|
|
tnh4 = max(mnh4,0.d0)
|
|
tno3 = max(mno3,0.d0)
|
|
x = 0.d0
|
|
if (tso4 .gt. 0.d0) then
|
|
x = tnh4/tso4
|
|
else
|
|
if (tno3 .gt. 0.d0 .and. tnh4 .gt. 0.d0) then
|
|
x = 10.d0
|
|
endif
|
|
endif
|
|
if (x .lt. 1.d0) then
|
|
mfs0 = poly4(c0,aw)
|
|
mfs1 = poly4(c1,aw)
|
|
y0 = (1.d0-mfs0)/mfs0
|
|
y1 = (1.d0-mfs1)/mfs1
|
|
y = (1.d0-x)*y0+x*y1
|
|
else if (x .lt. 1.5d0) then
|
|
if (irh .ge. 40) then
|
|
mfs1 = poly4(c1,aw)
|
|
mfs15 = poly4(c15,aw)
|
|
y1 = (1.d0-mfs1)/mfs1
|
|
y15 = (1.d0-mfs15)/mfs15
|
|
y = 2.d0*(y1*(1.5d0-x)+y15*(x-1.d0))
|
|
else
|
|
awc = 0.8d0*(x-1.d0)
|
|
y = 0.d0
|
|
if (aw .ge. awc) then
|
|
mfs1 = poly4(c1,0.4d0)
|
|
mfs15 = poly4(c15,0.4d0)
|
|
y140 = (1.d0-mfs1)/mfs1
|
|
y1540 = (1.d0-mfs15)/mfs15
|
|
y40 = 2.d0*(y140*(1.5d0-x)+y1540*(x-1.d0))
|
|
yc = 2.d0*y1540*(x-1.d0)
|
|
y = y40-(y40-yc)*(0.4d0-aw)/(0.4d0-awc)
|
|
endif
|
|
endif
|
|
else if (x .lt. 2.d0) then
|
|
y = 0.d0
|
|
if (irh .ge. 40) then
|
|
mfs15 = poly4(c15,aw)
|
|
y15 = (1.d0-mfs15)/mfs15
|
|
mfsso4 = poly6(kso4,aw)
|
|
y2 = (1.d0-mfsso4)/mfsso4
|
|
y = 2.d0*(y15*(2.d0-x)+y2*(x-1.5d0))
|
|
endif
|
|
else
|
|
y2 = 0.d0
|
|
y3 = 0.d0
|
|
if (irh .ge. 40) then
|
|
mfsso4 = poly6(kso4,aw)
|
|
mfsno3 = poly6(kno3,aw)
|
|
y2 = (1.d0-mfsso4)/mfsso4
|
|
y3 = (1.d0-mfsno3)/mfsno3
|
|
endif
|
|
endif
|
|
if (x .lt. 2.d0) then
|
|
adtnh4 = adtnh4+adwh2o*y*mwnh4
|
|
adtso4 = adtso4+adwh2o*y*mwso4
|
|
ady = ady+adwh2o*(tso4*mwso4+mwnh4*tnh4)
|
|
adwh2o = 0.
|
|
else
|
|
adtno3 = adtno3+adwh2o*y3*mwano3
|
|
adtso4 = adtso4+adwh2o*y2*mw2
|
|
adwh2o = 0.
|
|
endif
|
|
if (x .lt. 1.d0) then
|
|
adx = adx+ady*((-y0)+y1)
|
|
ady = 0.
|
|
else if (x .lt. 1.5d0) then
|
|
if (irh .ge. 40) then
|
|
adx = adx+2.d0*ady*((-y1)+y15)
|
|
ady = 0.
|
|
else
|
|
if (aw .ge. awc) then
|
|
adawc = adawc-ady*((y40-yc)*(0.4d0-aw)/((0.4d0-awc)*(0.4d0-
|
|
$awc)))
|
|
ady40 = ady40+ady*(1-(0.4d0-aw)/(0.4d0-awc))
|
|
adyc = adyc+ady*((0.4d0-aw)/(0.4d0-awc))
|
|
ady = 0.
|
|
adx = adx+2*adyc*y1540
|
|
adyc = 0.
|
|
adx = adx+2.d0*ady40*((-y140)+y1540)
|
|
ady40 = 0.
|
|
endif
|
|
adx = adx+0.8d0*adawc
|
|
adawc = 0.
|
|
endif
|
|
else if (x .lt. 2.d0) then
|
|
if (irh .ge. 40) then
|
|
adx = adx+2.d0*ady*((-y15)+y2)
|
|
ady = 0.
|
|
endif
|
|
endif
|
|
if (tso4 .gt. 0.d0) then
|
|
adtnh4 = adtnh4+adx/tso4
|
|
adtso4 = adtso4-adx*(tnh4/(tso4*tso4))
|
|
adx = 0.
|
|
endif
|
|
admno3 = admno3+adtno3*(0.5+sign(0.5d0,mno3-0.d0))
|
|
adtno3 = 0.
|
|
admnh4 = admnh4+adtnh4*(0.5+sign(0.5d0,mnh4-0.d0))
|
|
adtnh4 = 0.
|
|
admso4 = admso4+adtso4*(0.5+sign(0.5d0,mso4-0.d0))
|
|
adtso4 = 0.
|
|
|
|
end SUBROUTINE ADAWATER
|
|
!-----------------------------------------------------------------------------
|
|
|
|
subroutine adrpmares_11( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
! References to f90 modules
|
|
USE CHECKPT_MOD
|
|
USE RPMARES_MOD, ONLY : CUBIC, AWATER, ACTCOF
|
|
|
|
# include "CMN_SIZE" ! Size params
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 a0
|
|
real*8 a1
|
|
real*8 a2
|
|
real*8 ada0
|
|
real*8 ada1
|
|
real*8 ada2
|
|
real*8 adah2o
|
|
real*8 adahso4
|
|
real*8 adan(3)
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adano3_in
|
|
real*8 adaso4
|
|
real*8 adcat(2)
|
|
real*8 adcrutes(3)
|
|
real*8 aderor
|
|
real aderorh
|
|
real*8 adgamahat
|
|
real*8 adgamana
|
|
real*8 adgamas1
|
|
real*8 adgamas2
|
|
real*8 adgamold
|
|
real*8 adgams(2,3)
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adhplus
|
|
real*8 admhso4
|
|
real*8 admna
|
|
real*8 admnh4
|
|
real*8 admso4
|
|
real*8 adrk2sa
|
|
real*8 adrkna
|
|
real*8 adrknwet
|
|
real*8 adso4
|
|
real*8 adt21
|
|
real*8 adtmasshno3
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adwh2o
|
|
real*8 adxno3
|
|
real*8 adynh4
|
|
real*8 adzso4
|
|
real*8 ah2o
|
|
real*8 an(3)
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 cat(2)
|
|
real*8 crutes(3)
|
|
real*8 eror
|
|
real*8 erorh
|
|
integer exit
|
|
real*8 gamaab
|
|
real*8 gamahat
|
|
real*8 gamana
|
|
real*8 gamas1
|
|
real*8 gamas2
|
|
real*8 gamas2h
|
|
real*8 gamold
|
|
real*8 gams(2,3)
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
real*8 hplus
|
|
integer ip1
|
|
integer ip2
|
|
integer irh
|
|
real*8 k2sa
|
|
real*8 kna
|
|
real*8 mhso4
|
|
real*8 mna
|
|
real*8 mnh4
|
|
real*8 molnu
|
|
real*8 mso4
|
|
integer nnn
|
|
integer nnn1
|
|
integer nr
|
|
real*8 phibar
|
|
real*8 rh
|
|
real*8 rk2sa
|
|
real*8 rkna
|
|
real*8 rknwet
|
|
real*8 so4
|
|
real*8 t1
|
|
real*8 t2
|
|
real*8 t21
|
|
real*8 t3
|
|
real*8 t4
|
|
real*8 t6
|
|
real*8 temp
|
|
real*8 tmasshno3
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 toler2
|
|
real*8 tso4
|
|
real*8 wh2o
|
|
real*8 xno3
|
|
real*8 ynh4
|
|
real*8 zso4
|
|
|
|
C----------------------------------------------
|
|
C SAVE ARGUMENTS
|
|
C----------------------------------------------
|
|
!erorh = eror
|
|
erorh = 0.
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
ada0 = 0.
|
|
ada1 = 0.
|
|
ada2 = 0.
|
|
adah2o = 0.
|
|
adahso4 = 0.
|
|
do ip1 = 1, 3
|
|
adan(ip1) = 0.
|
|
end do
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adano3_in = 0.
|
|
adaso4 = 0.
|
|
do ip1 = 1, 2
|
|
adcat(ip1) = 0.
|
|
end do
|
|
do ip1 = 1, 3
|
|
adcrutes(ip1) = 0.
|
|
end do
|
|
aderor = 0.
|
|
adgamahat = 0.
|
|
adgamana = 0.
|
|
adgamas1 = 0.
|
|
adgamas2 = 0.
|
|
adgamold = 0.
|
|
do ip2 = 1, 3
|
|
do ip1 = 1, 2
|
|
adgams(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adhplus = 0.
|
|
admhso4 = 0.
|
|
admna = 0.
|
|
admnh4 = 0.
|
|
admso4 = 0.
|
|
adrk2sa = 0.
|
|
adrkna = 0.
|
|
adrknwet = 0.
|
|
adso4 = 0.
|
|
adt21 = 0.
|
|
adtmasshno3 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adwh2o = 0.
|
|
adxno3 = 0.
|
|
adynh4 = 0.
|
|
adzso4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
temp = par(2)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
tmasshno3 = max(0.d0,gno3+ano3)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
t6 = 8.2d-11*temp
|
|
t1 = 298.d0/temp
|
|
t2 = log(t1)
|
|
t3 = t1-1.d0
|
|
t4 = 1.d0+t2-t1
|
|
kna = 2511000.d0*exp(29.17d0*t3+16.83d0*t4)*t6
|
|
k2sa = 0.01015d0*exp(8.85d0*t3+25.14d0*t4)
|
|
call awater( irh,tso4,tnh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
zso4 = tso4/wh2o
|
|
gamaab = 1.d0
|
|
mnh4 = tnh4/wh2o
|
|
ynh4 = tnh4
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adahso4 = adahso4+adout(2)
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
do nnn = nitr_max(I,J,L), 1, -1
|
|
eror = erorh
|
|
exit = 0
|
|
call awater( irh,tso4,tnh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
gamana = 1.d0
|
|
gamas1 = 1.d0
|
|
gamas2 = 1.d0
|
|
gamold = 1.d0
|
|
|
|
!=====================================================================
|
|
! CHECKPOINT
|
|
! The adjoint calculation needs the variables error,exit,gamana,gamas1,
|
|
! gamas2,gamold and wh2o at iteration nnn-1. Rather than recompute,
|
|
! use the values saved durring the forward run, but only if nnn-1 > 0
|
|
!=====================================================================
|
|
IF (nnn-1 .gt. 0) THEN
|
|
eror = eror_fwd(I,J,L,nnn-1)
|
|
exit = exit_fwd(I,J,L,nnn-1)
|
|
gamana = gamana_fwd(I,J,L,nnn-1)
|
|
gamas1 = gamas1_fwd(I,J,L,nnn-1)
|
|
gamas2 = gamas2_fwd(I,J,L,nnn-1)
|
|
gamold = gamold_fwd(I,J,L,nnn-1)
|
|
wh2o = wh2o_fwd(I,J,L,nnn-1)
|
|
ENDIF
|
|
|
|
! do nnn1 = 1, nnn-1
|
|
! if (exit .eq. 0) then
|
|
! rk2sa = k2sa*gamas2*gamas2/(gamas1*gamas1*gamas1)
|
|
! rkna = kna/(gamana*gamana)
|
|
! rknwet = rkna*wh2o
|
|
! t21 = zso4-mnh4
|
|
! a2 = rk2sa+rknwet-t21
|
|
! a1 = rk2sa*rknwet-t21*(rk2sa+rknwet)-rk2sa*zso4-rkna*tno3
|
|
! a0 = -(t21*rk2sa*rknwet+rk2sa*rknwet*zso4+rk2sa*rkna*tno3)
|
|
! call cubic( a2,a1,a0,nr,crutes )
|
|
! hplus = crutes(1)
|
|
! mso4 = rk2sa*zso4/(hplus+rk2sa)
|
|
! mhso4 = max(1.d-10,zso4-mso4)
|
|
! mna = rkna*tno3/(hplus+rknwet)
|
|
! mna = max(0.,mna)
|
|
! mna = min(mna,tno3/wh2o)
|
|
! xno3 = mna*wh2o
|
|
! call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
! wh2o = 0.001d0*ah2o
|
|
! cat(1) = hplus
|
|
! cat(2) = mnh4
|
|
! an(1) = mso4
|
|
! an(2) = mna
|
|
! an(3) = mhso4
|
|
! call actcof( cat,an,gams,molnu,phibar )
|
|
! gamana = gams(1,2)
|
|
! gamas1 = gams(1,1)
|
|
! gamas2 = gams(1,3)
|
|
! gamahat = gamas2*gamas2/(gamaab*gamaab)
|
|
! eror = abs(gamold-gamahat)/gamold
|
|
! gamold = gamahat
|
|
! endif
|
|
! if (eror .le. toler2) then
|
|
! exit = 11
|
|
! endif
|
|
! end do
|
|
gamas2h = gamas2
|
|
if (exit .eq. 0) then
|
|
rk2sa = k2sa*gamas2*gamas2/(gamas1*gamas1*gamas1)
|
|
rkna = kna/(gamana*gamana)
|
|
rknwet = rkna*wh2o
|
|
t21 = zso4-mnh4
|
|
a2 = rk2sa+rknwet-t21
|
|
a1 = rk2sa*rknwet-t21*(rk2sa+rknwet)-rk2sa*zso4-rkna*tno3
|
|
a0 = -(t21*rk2sa*rknwet+rk2sa*rknwet*zso4+rk2sa*rkna*tno3)
|
|
call cubic( a2,a1,a0,nr,crutes )
|
|
hplus = crutes(1)
|
|
mso4 = rk2sa*zso4/(hplus+rk2sa)
|
|
mhso4 = max(1.d-10,zso4-mso4)
|
|
mna = rkna*tno3/(hplus+rknwet)
|
|
mna = max(0.,mna)
|
|
mna = min(mna,tno3/wh2o)
|
|
xno3 = mna*wh2o
|
|
ano3 = mna*wh2o*mwno3
|
|
cat(1) = hplus
|
|
cat(2) = mnh4
|
|
an(1) = mso4
|
|
an(2) = mna
|
|
an(3) = mhso4
|
|
call actcof( cat,an,gams,molnu,phibar )
|
|
gamas2 = gams(1,3)
|
|
gamahat = gamas2*gamas2/(gamaab*gamaab)
|
|
adgamahat = adgamahat+adgamold
|
|
adgamold = 0.
|
|
aderorh = aderor/gamold
|
|
adgamold = adgamold-aderor*(abs(gamold-gamahat)/(gamold*
|
|
$gamold))
|
|
adgamahat = adgamahat-aderorh*sign(1.d0,gamold-gamahat)
|
|
adgamold = adgamold+aderorh*sign(1.d0,gamold-gamahat)
|
|
aderor = 0.
|
|
adgamas2 = adgamas2+adgamahat*(2*gamas2/(gamaab*gamaab))
|
|
adgamahat = 0.
|
|
adgams(1,3) = adgams(1,3)+adgamas2
|
|
adgamas2 = 0.
|
|
adgams(1,1) = adgams(1,1)+adgamas1
|
|
adgamas1 = 0.
|
|
adgams(1,2) = adgams(1,2)+adgamana
|
|
adgamana = 0.
|
|
call adactcof( cat,an,adcat,adan,adgams )
|
|
admhso4 = admhso4+adan(3)
|
|
adan(3) = 0.
|
|
admna = admna+adan(2)
|
|
adan(2) = 0.
|
|
admso4 = admso4+adan(1)
|
|
adan(1) = 0.
|
|
admnh4 = admnh4+adcat(2)
|
|
adcat(2) = 0.
|
|
adhplus = adhplus+adcat(1)
|
|
adcat(1) = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
call adawater( irh,tso4,ynh4,xno3,adtso4,adynh4,adxno3,adah2o
|
|
$)
|
|
admhso4 = admhso4+adahso4*wh2o*mwso4
|
|
adwh2o = adwh2o+adahso4*mhso4*mwso4
|
|
adahso4 = 0.
|
|
admso4 = admso4+adaso4*wh2o*mwso4
|
|
adwh2o = adwh2o+adaso4*mso4*mwso4
|
|
adaso4 = 0.
|
|
adano3 =adano3-adgno3*(0.5-sign(0.5d0,floor-(tmasshno3-ano3)))
|
|
adtmasshno3 = adtmasshno3+adgno3*(0.5-sign(0.5d0,floor-
|
|
$(tmasshno3-ano3)))
|
|
adgno3 = 0.
|
|
admna = admna+adano3*wh2o*mwno3
|
|
adwh2o = adwh2o+adano3*mna*mwno3
|
|
adano3 = 0.
|
|
admna = admna+adxno3*wh2o
|
|
adwh2o = adwh2o+adxno3*mna
|
|
adxno3 = 0.
|
|
mna = rkna*tno3/(hplus+rknwet)
|
|
mna = max(0.,mna)
|
|
adtno3 = adtno3+admna*((0.5-sign(0.5d0,tno3/wh2o-mna))/wh2o)
|
|
adwh2o = adwh2o-admna*(0.5-sign(0.5d0,tno3/wh2o-mna))*(tno3/
|
|
$(wh2o*wh2o))
|
|
admna = admna*(0.5+sign(0.5d0,tno3/wh2o-mna))
|
|
mna = rkna*tno3/(hplus+rknwet)
|
|
admna = admna*(0.5-sign(0.5d0,0.-mna))
|
|
adhplus = adhplus-admna*(rkna*tno3/((hplus+rknwet)*(hplus+
|
|
$rknwet)))
|
|
adrkna = adrkna+admna*(tno3/(hplus+rknwet))
|
|
adrknwet = adrknwet-admna*(rkna*tno3/((hplus+rknwet)*(hplus+
|
|
$rknwet)))
|
|
adtno3 = adtno3+admna*(rkna/(hplus+rknwet))
|
|
admna = 0.
|
|
admso4 = admso4-admhso4*(0.5-sign(0.5d0,1.d-10-(zso4-mso4)))
|
|
adzso4 = adzso4+admhso4*(0.5-sign(0.5d0,1.d-10-(zso4-mso4)))
|
|
admhso4 = 0.
|
|
adhplus = adhplus-admso4*(rk2sa*zso4/((hplus+rk2sa)*(hplus+
|
|
$rk2sa)))
|
|
adrk2sa = adrk2sa+admso4*(zso4/(hplus+rk2sa)-rk2sa*zso4/
|
|
$((hplus+rk2sa)*(hplus+rk2sa)))
|
|
adzso4 = adzso4+admso4*(rk2sa/(hplus+rk2sa))
|
|
admso4 = 0.
|
|
adcrutes(1) = adcrutes(1)+adhplus
|
|
adhplus = 0.
|
|
call adcubic( a2,a1,a0,ada2,ada1,ada0,adcrutes )
|
|
adrk2sa = adrk2sa-ada0*(rknwet*(t21+zso4)+rkna*tno3)
|
|
adrkna = adrkna-ada0*rk2sa*tno3
|
|
adrknwet = adrknwet-ada0*rk2sa*(t21+zso4)
|
|
adt21 = adt21-ada0*rk2sa*rknwet
|
|
adtno3 = adtno3-ada0*rk2sa*rkna
|
|
adzso4 = adzso4-ada0*rk2sa*rknwet
|
|
ada0 = 0.
|
|
adrk2sa = adrk2sa+ada1*(rknwet-t21-zso4)
|
|
adrkna = adrkna-ada1*tno3
|
|
adrknwet = adrknwet+ada1*(rk2sa-t21)
|
|
adt21 = adt21-ada1*(rk2sa+rknwet)
|
|
adtno3 = adtno3-ada1*rkna
|
|
adzso4 = adzso4-ada1*rk2sa
|
|
ada1 = 0.
|
|
adrk2sa = adrk2sa+ada2
|
|
adrknwet = adrknwet+ada2
|
|
adt21 = adt21-ada2
|
|
ada2 = 0.
|
|
admnh4 = admnh4-adt21
|
|
adzso4 = adzso4+adt21
|
|
adt21 = 0.
|
|
adrkna = adrkna+adrknwet*wh2o
|
|
adwh2o = adwh2o+adrknwet*rkna
|
|
adrknwet = 0.
|
|
adgamana = adgamana-adrkna*(2*kna*gamana/(gamana*gamana*
|
|
$gamana*gamana))
|
|
adrkna = 0.
|
|
gamas2 = gamas2h
|
|
adgamas1 = adgamas1-adrk2sa*(3*k2sa*gamas2*gamas2*gamas1*
|
|
$gamas1/(gamas1*gamas1*gamas1*gamas1*gamas1*gamas1))
|
|
adgamas2 = adgamas2+adrk2sa*(2*k2sa*gamas2/(gamas1*gamas1*
|
|
$gamas1))
|
|
adrk2sa = 0.
|
|
endif
|
|
end do
|
|
adtnh4 = adtnh4+adynh4
|
|
adynh4 = 0.
|
|
call awater( irh,tso4,tnh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
adtnh4 = adtnh4+admnh4/wh2o
|
|
adwh2o = adwh2o-admnh4*(tnh4/(wh2o*wh2o))
|
|
admnh4 = 0.
|
|
adtso4 = adtso4+adzso4/wh2o
|
|
adwh2o = adwh2o-adzso4*(tso4/(wh2o*wh2o))
|
|
adzso4 = 0.
|
|
adgnh3 = 0.
|
|
adano3 = adano3-adgno3
|
|
adtmasshno3 = adtmasshno3+adgno3
|
|
adgno3 = 0.
|
|
adano3_in = adano3_in+adano3
|
|
adano3 = 0.
|
|
adtnh4 = adtnh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adtso4 = adtso4+adahso4*mwso4
|
|
adahso4 = 0.
|
|
adaso4 = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
call adawater( irh,tso4,tnh4,tno3,adtso4,adtnh4,adtno3,adah2o )
|
|
ano3 = in(4)
|
|
adano3 = adano3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adgno3 = adgno3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adtmasshno3 = 0.
|
|
adano3 = adano3+adano3_in
|
|
adano3_in = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_11
|
|
!-----------------------------------------------------------------------------
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_12( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adah2o
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adano3_in
|
|
real*8 adaso4
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adgno3_in
|
|
real*8 adso4
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer irh
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adah2o = 0.
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adano3_in = 0.
|
|
adaso4 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adgno3_in = 0.
|
|
adso4 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
call adawater( irh,tso4,tnh4,tno3,adtso4,adtnh4,adtno3,adah2o )
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
adano3_in = adano3_in+adano3
|
|
adano3 = 0.
|
|
adgno3_in = adgno3_in+adgno3
|
|
adgno3 = 0.
|
|
adgnh3 = 0.
|
|
adtnh4 = adtnh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adano3 = adano3+adano3_in
|
|
adano3_in = 0.
|
|
adgno3 = adgno3+adgno3_in
|
|
adgno3_in = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_12
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_2( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 minno3
|
|
parameter ( minno3 = 1.d-6/mwno3 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
real*8 minso4
|
|
parameter ( minso4 = 1.d-6/mwso4 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adaso4
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adso4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 aso4
|
|
integer exit
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adaso4 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adso4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
aso4 = 0.d0
|
|
exit = 0
|
|
if (rh .lt. 0.01) then
|
|
exit = 1
|
|
endif
|
|
if (exit .eq. 0) then
|
|
tso4 = max(floor,so4/mwso4)
|
|
aso4 = so4
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
endif
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
if (tso4 .lt. minso4 .and. tno3 .lt. minno3) then
|
|
if (exit .eq. 0) then
|
|
adgno3 = adgno3*(0.5-sign(0.5d0,floor-gno3))
|
|
adgnh3 = adgnh3*(0.5-sign(0.5d0,floor-gnh3))
|
|
adanh4 = adanh4*(0.5-sign(0.5d0,floor-anh4))
|
|
adano3 = adano3*(0.5-sign(0.5d0,floor-ano3))
|
|
adaso4 = adaso4*(0.5-sign(0.5d0,floor-aso4))
|
|
endif
|
|
endif
|
|
if (exit .eq. 0) then
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adaso4
|
|
adaso4 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
endif
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_2
|
|
!-----------------------------------------------------------------------------
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_3( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adah2o
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adano3_in
|
|
real*8 adaso4
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adgno3_in
|
|
real*8 adso4
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adtwoso4
|
|
real*8 adwh2o
|
|
real*8 adynh4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer irh
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
real*8 twoso4
|
|
real*8 ynh4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adah2o = 0.
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adano3_in = 0.
|
|
adaso4 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adgno3_in = 0.
|
|
adso4 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adtwoso4 = 0.
|
|
adwh2o = 0.
|
|
adynh4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
twoso4 = 2.*tso4
|
|
ynh4 = twoso4
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
adano3_in = adano3_in+adano3
|
|
adano3 = 0.
|
|
adgno3_in = adgno3_in+adgno3
|
|
adgno3 = 0.
|
|
adtnh4 = adtnh4+adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)))
|
|
adynh4 = adynh4-adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)))
|
|
adgnh3 = 0.
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adwh2o = adwh2o+1000*adah2o
|
|
adah2o = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = twoso4
|
|
call adawater( irh,tso4,ynh4,tno3,adtso4,adynh4,adtno3,adah2o )
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtso4 = adtso4+2*adtwoso4
|
|
adtwoso4 = 0.
|
|
adano3 = adano3+adano3_in
|
|
adano3_in = 0.
|
|
adgno3 = adgno3+adgno3_in
|
|
adgno3_in = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_3
|
|
|
|
!-----------------------------------------------------------------------------
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_4( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real aa
|
|
real*8 adah2o
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adaso4
|
|
real*8 adbb
|
|
real*8 adcc
|
|
real*8 addd
|
|
real*8 addisc
|
|
real*8 adfnh3
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adso4
|
|
real*8 adtmasshno3
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adtwoso4
|
|
real*8 adwh2o
|
|
real*8 adxno3
|
|
real*8 adxxq
|
|
real*8 adynh4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 bb
|
|
real*8 cc
|
|
real*8 convt
|
|
real*8 dd
|
|
real*8 disc
|
|
real*8 fnh3
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer irh
|
|
real*8 k3
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 temp
|
|
real*8 tmasshno3
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
real*8 twoso4
|
|
real*8 xno3
|
|
real*8 xxq
|
|
real*8 ynh4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adah2o = 0.
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adaso4 = 0.
|
|
adbb = 0.
|
|
adcc = 0.
|
|
addd = 0.
|
|
addisc = 0.
|
|
adfnh3 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adso4 = 0.
|
|
adtmasshno3 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adtwoso4 = 0.
|
|
adwh2o = 0.
|
|
adxno3 = 0.
|
|
adxxq = 0.
|
|
adynh4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
temp = par(2)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
tmasshno3 = max(0.d0,gno3+ano3)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
convt = 1.d0/(0.082d0*temp)
|
|
k3 = exp(118.87-24084./temp-6.025*log(temp))
|
|
k3 = k3*convt*convt
|
|
twoso4 = 2.*tso4
|
|
fnh3 = tnh4-twoso4
|
|
cc = tno3*fnh3-k3
|
|
if (cc .le. 0.d0) then
|
|
xno3 = 0.d0
|
|
else
|
|
aa = 1.d0
|
|
bb = -(tno3+fnh3)
|
|
disc = bb*bb-4.*cc
|
|
dd = sqrt(disc)
|
|
xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
xno3 = min(xxq/aa,cc/xxq)
|
|
endif
|
|
ynh4 = twoso4+xno3
|
|
ano3 = xno3*mwno3
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
adano3 = adano3-adgno3*(0.5-sign(0.5d0,floor-(tmasshno3-ano3)))
|
|
adtmasshno3 = adtmasshno3+adgno3*(0.5-sign(0.5d0,floor-(tmasshno3-
|
|
$ano3)))
|
|
adgno3 = 0.
|
|
adtnh4 = adtnh4+adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)))
|
|
adynh4 = adynh4-adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)))
|
|
adgnh3 = 0.
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adxno3 = adxno3+adano3*mwno3
|
|
adano3 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adxno3 = adxno3+adynh4
|
|
adynh4 = 0.
|
|
adwh2o = adwh2o+1000*adah2o
|
|
adah2o = 0.
|
|
if (cc .le. 0.d0) then
|
|
else
|
|
adcc = adcc+adxno3*((0.5-sign(0.5d0,cc/xxq-xxq/aa))/xxq)
|
|
adxxq = adxxq+adxno3*((0.5+sign(0.5d0,cc/xxq-xxq/aa))/aa-(0.5-
|
|
$sign(0.5d0,cc/xxq-xxq/aa))*(cc/(xxq*xxq)))
|
|
adxno3 = 0.
|
|
adbb = adbb-0.5d0*adxxq
|
|
addd = addd-0.5d0*adxxq*sign(1.d0,bb)
|
|
adxxq = 0.
|
|
addisc = addisc+addd*(1./(2.*sqrt(disc)))
|
|
addd = 0.
|
|
adbb = adbb+2*addisc*bb
|
|
adcc = adcc-4*addisc
|
|
addisc = 0.
|
|
adfnh3 = adfnh3-adbb
|
|
adtno3 = adtno3-adbb
|
|
adbb = 0.
|
|
endif
|
|
adfnh3 = adfnh3+adcc*tno3
|
|
adtno3 = adtno3+adcc*fnh3
|
|
adcc = 0.
|
|
adtnh4 = adtnh4+adfnh3
|
|
adtwoso4 = adtwoso4-adfnh3
|
|
adfnh3 = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = twoso4
|
|
call adawater( irh,tso4,ynh4,tno3,adtso4,adynh4,adtno3,adah2o )
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtso4 = adtso4+2*adtwoso4
|
|
adtwoso4 = 0.
|
|
ano3 = in(4)
|
|
adano3 = adano3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adgno3 = adgno3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adtmasshno3 = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_4
|
|
|
|
!-----------------------------------------------------------------------------
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_6( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
! References to f90 modules
|
|
USE CHECKPT_MOD
|
|
USE RPMARES_MOD, ONLY : AWATER, ACTCOF
|
|
|
|
# include "CMN_SIZE" ! Size params
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define arguments
|
|
C============================================= =
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real aa
|
|
real adaa
|
|
real*8 adah2o
|
|
real*8 adan(3)
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adaso4
|
|
real*8 adbb
|
|
real*8 adcat(2)
|
|
real*8 adcc
|
|
real*8 addd
|
|
real*8 addisc
|
|
real*8 aderor
|
|
real aderorh
|
|
real*8 adgamaan
|
|
real*8 adgamold
|
|
real*8 adgams(2,3)
|
|
real*8 adgasqd
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adkw2
|
|
real*8 adman
|
|
real*8 admas
|
|
real*8 admnh4
|
|
real*8 adrr1
|
|
real*8 adrr2
|
|
real*8 adso4
|
|
real*8 adtmasshno3
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adtwoso4
|
|
real*8 adwh2o
|
|
real*8 adwsqd
|
|
real*8 adxno3
|
|
real*8 adxxq
|
|
real*8 adynh4
|
|
real*8 ah2o
|
|
real*8 an(3)
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 bb
|
|
real*8 cat(2)
|
|
real*8 cc
|
|
real*8 dd
|
|
real*8 disc
|
|
real*8 eror
|
|
integer exit
|
|
real*8 gamaan
|
|
real*8 gamaanh
|
|
real*8 gamold
|
|
real*8 gams(2,3)
|
|
real*8 gasqd
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer ip1
|
|
integer ip2
|
|
integer irh
|
|
real*8 k1a
|
|
real*8 kan
|
|
real*8 khat
|
|
real*8 kna
|
|
real*8 kph
|
|
real*8 kw
|
|
real*8 kw2
|
|
real*8 man
|
|
real*8 mas
|
|
real*8 mnh4
|
|
real*8 molnu
|
|
integer nnn
|
|
integer nnn1
|
|
real*8 phibar
|
|
real*8 rh
|
|
real*8 rr1
|
|
real*8 rr2
|
|
real*8 so4
|
|
real*8 t1
|
|
real*8 t2
|
|
real*8 t3
|
|
real*8 t4
|
|
real*8 t6
|
|
real*8 temp
|
|
real*8 tmasshno3
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 toler1
|
|
real*8 tso4
|
|
real*8 twoso4
|
|
real*8 wh2o
|
|
real*8 wh2oh
|
|
real*8 wsqd
|
|
real*8 xno3
|
|
real*8 xxq
|
|
real*8 ynh4
|
|
real*8 ynh4h
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adaa = 0.
|
|
adah2o = 0.
|
|
do ip1 = 1, 3
|
|
adan(ip1) = 0.
|
|
end do
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adaso4 = 0.
|
|
adbb = 0.
|
|
do ip1 = 1, 2
|
|
adcat(ip1) = 0.
|
|
end do
|
|
adcc = 0.
|
|
addd = 0.
|
|
addisc = 0.
|
|
aderor = 0.
|
|
adgamaan = 0.
|
|
adgamold = 0.
|
|
do ip2 = 1, 3
|
|
do ip1 = 1, 2
|
|
adgams(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
adgasqd = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adkw2 = 0.
|
|
adman = 0.
|
|
admas = 0.
|
|
admnh4 = 0.
|
|
adrr1 = 0.
|
|
adrr2 = 0.
|
|
adso4 = 0.
|
|
adtmasshno3 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adtwoso4 = 0.
|
|
adwh2o = 0.
|
|
adwsqd = 0.
|
|
adxno3 = 0.
|
|
adxxq = 0.
|
|
adynh4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
temp = par(2)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
tmasshno3 = max(0.d0,gno3+ano3)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
t6 = 8.2d-11*temp
|
|
t1 = 298.d0/temp
|
|
t2 = log(t1)
|
|
t3 = t1-1.d0
|
|
t4 = 1.d0+t2-t1
|
|
kna = 2511000.d0*exp(29.17d0*t3+16.83d0*t4)*t6
|
|
k1a = 0.00001805d0*exp((-(1.5d0*t3))+26.92d0*t4)
|
|
kw = 1.01d-14*exp((-(22.52d0*t3))+26.92d0*t4)
|
|
kph = 57.639d0*exp(13.79d0*t3-5.39d0*t4)*t6
|
|
khat = kph*k1a/kw
|
|
kan = kna*khat
|
|
toler1 = 0.00001d0
|
|
twoso4 = 2.*tso4
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
!do nnn = 50, 1, -1
|
|
do nnn = nitr_max(I,J,L), 1, -1
|
|
exit = 0
|
|
gamold = 1.d0
|
|
gamaan = 0.1
|
|
ynh4 = twoso4
|
|
call awater( irh,tso4,ynh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
ynh4 = twoso4
|
|
|
|
!=====================================================================
|
|
! CHECKPOINT
|
|
! The do loop below was soley for the recomputation of ynh4h, wh2oh,
|
|
! gamaanhm, exit and gamold.
|
|
! Instead of recomputing these quantities, get them from the forward
|
|
! calculation, except if nnn is 1, in which case they are just their
|
|
! normal values
|
|
!=====================================================================
|
|
IF (nnn-1 .gt. 0) THEN
|
|
ynh4h = ynh4_fwd(I,J,L,nnn-1)
|
|
wh2oh = wh2o_fwd(I,J,L,nnn-1)
|
|
gamaanh = gamaan_fwd(I,J,L,nnn-1)
|
|
gamold = gamold_fwd(I,J,L,nnn-1)
|
|
exit = exit_fwd(I,J,L,nnn-1)
|
|
ENDIF
|
|
|
|
! do nnn1 = 1, nnn-1
|
|
! gasqd = gamaan*gamaan
|
|
! wsqd = wh2o*wh2o
|
|
! kw2 = kan*wsqd/gasqd
|
|
! aa = 1.-kw2
|
|
! bb = twoso4+kw2*(tno3+tnh4-twoso4)
|
|
! cc = -(kw2*tno3*(tnh4-twoso4))
|
|
! disc = bb*bb-4.*aa*cc
|
|
! if (aa .ne. 0.d0) then
|
|
! dd = sqrt(disc)
|
|
! xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
! rr1 = xxq/aa
|
|
! rr2 = cc/xxq
|
|
! if (rr1*rr2 .lt. 0.d0) then
|
|
! xno3 = max(rr1,rr2)
|
|
! else
|
|
! xno3 = min(rr1,rr2)
|
|
! endif
|
|
! else
|
|
! xno3 = -(cc/bb)
|
|
! endif
|
|
! xno3 = min(xno3,tno3)
|
|
! call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
! wh2o = 0.001*ah2o
|
|
! man = xno3/wh2o
|
|
! mas = tso4/wh2o
|
|
! mnh4 = 2.*mas+man
|
|
! ynh4 = mnh4*wh2o
|
|
! cat(1) = 0.
|
|
! cat(2) = mnh4
|
|
! an(1) = mas
|
|
! an(2) = man
|
|
! an(3) = 0.
|
|
! call actcof( cat,an,gams,molnu,phibar )
|
|
! gamaan = gams(2,2)
|
|
! eror = abs(gamold-gamaan)/gamold
|
|
! gamold = gamaan
|
|
! if (eror .le. toler1) then
|
|
! if (exit .eq. 0) then
|
|
! exit = 6
|
|
! endif
|
|
! endif
|
|
! end do
|
|
ynh4h = ynh4
|
|
wh2oh = wh2o
|
|
gamaanh = gamaan
|
|
gasqd = gamaan*gamaan
|
|
wsqd = wh2o*wh2o
|
|
kw2 = kan*wsqd/gasqd
|
|
aa = 1.-kw2
|
|
bb = twoso4+kw2*(tno3+tnh4-twoso4)
|
|
cc = -(kw2*tno3*(tnh4-twoso4))
|
|
disc = bb*bb-4.*aa*cc
|
|
if (aa .ne. 0.d0) then
|
|
dd = sqrt(disc)
|
|
xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
rr1 = xxq/aa
|
|
rr2 = cc/xxq
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
xno3 = max(rr1,rr2)
|
|
else
|
|
xno3 = min(rr1,rr2)
|
|
endif
|
|
else
|
|
xno3 = -(cc/bb)
|
|
endif
|
|
xno3 = min(xno3,tno3)
|
|
call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
wh2o = 0.001*ah2o
|
|
man = xno3/wh2o
|
|
mas = tso4/wh2o
|
|
mnh4 = 2.*mas+man
|
|
ynh4 = mnh4*wh2o
|
|
cat(1) = 0.
|
|
cat(2) = mnh4
|
|
an(1) = mas
|
|
an(2) = man
|
|
an(3) = 0.
|
|
call actcof( cat,an,gams,molnu,phibar )
|
|
gamaan = gams(2,2)
|
|
eror = abs(gamold-gamaan)/gamold
|
|
if (eror .le. toler1) then
|
|
if (exit .eq. 0) then
|
|
ano3 = xno3*mwno3
|
|
adwh2o = adwh2o+1000*adah2o
|
|
adah2o = 0.
|
|
adtnh4 = adtnh4+adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)
|
|
$))
|
|
adynh4 = adynh4-adgnh3*mwnh3*(0.5-sign(0.5d0,floor-(tnh4-ynh4)
|
|
$))
|
|
adgnh3 = 0.
|
|
adano3 = adano3-adgno3*(0.5-sign(0.5d0,floor-(tmasshno3-ano3))
|
|
$)
|
|
adtmasshno3 = adtmasshno3+adgno3*(0.5d0-sign(0.5d0,floor-
|
|
$(tmasshno3-ano3)))
|
|
adgno3 = 0.
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adxno3 = adxno3+adano3*mwno3
|
|
adano3 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
endif
|
|
endif
|
|
adgamaan = adgamaan+adgamold
|
|
adgamold = 0.
|
|
aderorh = aderor/gamold
|
|
adgamold = adgamold-aderor*(abs(gamold-gamaan)/(gamold*gamold))
|
|
adgamaan = adgamaan-aderorh*sign(1.d0,gamold-gamaan)
|
|
adgamold = adgamold+aderorh*sign(1.d0,gamold-gamaan)
|
|
aderor = 0.
|
|
adgams(2,2) = adgams(2,2)+adgamaan
|
|
adgamaan = 0.
|
|
call adactcof( cat,an,adcat,adan,adgams )
|
|
adan(3) = 0.
|
|
adman = adman+adan(2)
|
|
adan(2) = 0.
|
|
admas = admas+adan(1)
|
|
adan(1) = 0.
|
|
admnh4 = admnh4+adcat(2)
|
|
adcat(2) = 0.
|
|
adcat(1) = 0.
|
|
admnh4 = admnh4+adynh4*wh2o
|
|
adwh2o = adwh2o+adynh4*mnh4
|
|
adynh4 = 0.
|
|
adman = adman+admnh4
|
|
admas = admas+2*admnh4
|
|
admnh4 = 0.
|
|
adtso4 = adtso4+admas/wh2o
|
|
adwh2o = adwh2o-admas*(tso4/(wh2o*wh2o))
|
|
admas = 0.
|
|
adwh2o = adwh2o-adman*(xno3/(wh2o*wh2o))
|
|
adxno3 = adxno3+adman/wh2o
|
|
adman = 0.
|
|
adah2o = adah2o+0.001*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = ynh4h
|
|
call adawater( irh,tso4,ynh4,xno3,adtso4,adynh4,adxno3,adah2o )
|
|
if (aa .ne. 0.d0) then
|
|
dd = sqrt(disc)
|
|
xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
rr1 = xxq/aa
|
|
rr2 = cc/xxq
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
xno3 = max(rr1,rr2)
|
|
else
|
|
xno3 = min(rr1,rr2)
|
|
endif
|
|
else
|
|
xno3 = -(cc/bb)
|
|
endif
|
|
adtno3 = adtno3+adxno3*(0.5-sign(0.5d0,tno3-xno3))
|
|
adxno3 = adxno3*(0.5+sign(0.5d0,tno3-xno3))
|
|
if (aa .ne. 0.d0) then
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
adrr1 = adrr1+adxno3*(0.5+sign(0.5d0,rr1-rr2))
|
|
adrr2 = adrr2+adxno3*(0.5-sign(0.5d0,rr1-rr2))
|
|
adxno3 = 0.
|
|
else
|
|
adrr1 = adrr1+adxno3*(0.5+sign(0.5d0,rr2-rr1))
|
|
adrr2 = adrr2+adxno3*(0.5-sign(0.5d0,rr2-rr1))
|
|
adxno3 = 0.
|
|
endif
|
|
adcc = adcc+adrr2/xxq
|
|
adxxq = adxxq-adrr2*(cc/(xxq*xxq))
|
|
adrr2 = 0.
|
|
adaa = adaa-adrr1*(xxq/(aa*aa))
|
|
adxxq = adxxq+adrr1/aa
|
|
adrr1 = 0.
|
|
adbb = adbb-0.5d0*adxxq
|
|
addd = addd-0.5d0*adxxq*sign(1.d0,bb)
|
|
adxxq = 0.
|
|
addisc = addisc+addd*(1./(2.*sqrt(disc)))
|
|
addd = 0.
|
|
else
|
|
adbb = adbb+adxno3*(cc/(bb*bb))
|
|
adcc = adcc-adxno3/bb
|
|
adxno3 = 0.
|
|
endif
|
|
adaa = adaa-4*addisc*cc
|
|
adbb = adbb+2*addisc*bb
|
|
adcc = adcc-4*addisc*aa
|
|
addisc = 0.
|
|
adkw2 = adkw2-adcc*tno3*(tnh4-twoso4)
|
|
adtnh4 = adtnh4-adcc*kw2*tno3
|
|
adtno3 = adtno3-adcc*kw2*(tnh4-twoso4)
|
|
adtwoso4 = adtwoso4+adcc*kw2*tno3
|
|
adcc = 0.
|
|
adkw2 = adkw2+adbb*(tno3+tnh4-twoso4)
|
|
adtnh4 = adtnh4+adbb*kw2
|
|
adtno3 = adtno3+adbb*kw2
|
|
adtwoso4 = adtwoso4+adbb*(1-kw2)
|
|
adbb = 0.
|
|
adkw2 = adkw2-adaa
|
|
adaa = 0.
|
|
adgasqd = adgasqd-adkw2*(kan*wsqd/(gasqd*gasqd))
|
|
adwsqd = adwsqd+adkw2*(kan/gasqd)
|
|
adkw2 = 0.
|
|
wh2o = wh2oh
|
|
adwh2o = adwh2o+2*adwsqd*wh2o
|
|
adwsqd = 0.
|
|
gamaan = gamaanh
|
|
adgamaan = adgamaan+2*adgasqd*gamaan
|
|
adgasqd = 0.
|
|
end do
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = twoso4
|
|
call adawater( irh,tso4,ynh4,tno3,adtso4,adynh4,adtno3,adah2o )
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtso4 = adtso4+2*adtwoso4
|
|
adtwoso4 = 0.
|
|
ano3 = in(4)
|
|
adano3 = adano3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adgno3 = adgno3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adtmasshno3 = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_6
|
|
|
|
!-----------------------------------------------------------------------------
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_7( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adah2o
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adano3_in
|
|
real*8 adaso4
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adgno3_in
|
|
real*8 adso4
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adtwoso4
|
|
real*8 adxno3
|
|
real*8 adynh4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer irh
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
real*8 twoso4
|
|
real*8 xno3
|
|
real*8 ynh4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adah2o = 0.
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adano3_in = 0.
|
|
adaso4 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adgno3_in = 0.
|
|
adso4 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adtwoso4 = 0.
|
|
adxno3 = 0.
|
|
adynh4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
twoso4 = 2.*tso4
|
|
xno3 = tno3/mwno3
|
|
ynh4 = twoso4
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
adtnh4 = adtnh4+adgnh3*(0.5-sign(0.5d0,floor-mwnh3*(tnh4-ynh4)))*
|
|
$mwnh3
|
|
adynh4 = adynh4-adgnh3*(0.5-sign(0.5d0,floor-mwnh3*(tnh4-ynh4)))*
|
|
$mwnh3
|
|
adgnh3 = 0.
|
|
adano3_in = adano3_in+adano3
|
|
adano3 = 0.
|
|
adgno3_in = adgno3_in+adgno3
|
|
adgno3 = 0.
|
|
call adawater( irh,tso4,ynh4,xno3,adtso4,adynh4,adxno3,adah2o )
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtno3 = adtno3+adxno3/mwno3
|
|
adxno3 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
ynh4 = twoso4
|
|
call adawater( irh,tso4,ynh4,tno3,adtso4,adynh4,adtno3,adah2o )
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtso4 = adtso4+2*adtwoso4
|
|
adtwoso4 = 0.
|
|
adano3 = adano3+adano3_in
|
|
adano3_in = 0.
|
|
adgno3 = adgno3+adgno3_in
|
|
adgno3_in = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_7
|
|
|
|
!-----------------------------------------------------------------------------
|
|
|
|
|
|
C DISCLAIMER
|
|
C
|
|
C This file was generated by TAMC version 5.3.2
|
|
C
|
|
C THE AUTHOR DOES NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
|
|
C ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
|
C OR USEFULNESS OF ANY INFORMATION OR PROCESS DISCLOSED, OR REPRESENTS
|
|
C THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.
|
|
C
|
|
C THIS CODE IS FOR NON-PROFIT-ORIENTATED ACADEMIC RESEARCH AND EDUCATION
|
|
C ONLY. ANY COMMERCIAL OR OTHER PROFIT-ORIENTATED USE OR EVALUATION IS
|
|
C STRICTLY FORBIDDEN. PASSING THIS CODE TO ANY THIRD PARTY IS NOT
|
|
C ALLOWED.
|
|
C
|
|
C FOR COMMERCIAL OR OTHER PROFIT-ORIENTATED APPLICATIONS PLEASE CONTACT
|
|
C info@FastOpt.com
|
|
C
|
|
subroutine adrpmares_8( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
double precision par(2)
|
|
INTEGER :: I, J, L
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 adah2o
|
|
real*8 adahso4
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adano3_in
|
|
real*8 adaso4
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adso4
|
|
real*8 adtmasshno3
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer irh
|
|
real*8 rh
|
|
real*8 so4
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 tso4
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adah2o = 0.
|
|
adahso4 = 0.
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adano3_in = 0.
|
|
adaso4 = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adso4 = 0.
|
|
adtmasshno3 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adahso4 = adahso4+adout(2)
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
adgnh3 = 0.
|
|
adano3 = adano3-adgno3
|
|
adtmasshno3 = adtmasshno3+adgno3
|
|
adgno3 = 0.
|
|
adano3_in = adano3_in+adano3
|
|
adano3 = 0.
|
|
adtnh4 = adtnh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adtso4 = adtso4+adahso4*mwso4
|
|
adahso4 = 0.
|
|
adaso4 = 0.
|
|
call adawater( irh,tso4,tnh4,tno3,adtso4,adtnh4,adtno3,adah2o )
|
|
adano3 = adano3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adgno3 = adgno3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adtmasshno3 = 0.
|
|
adano3 = adano3+adano3_in
|
|
adano3_in = 0.
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5d0,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
end SUBROUTINE ADRPMARES_8
|
|
!------------------------------------------------------------------------------
|
|
|
|
subroutine adcubic( a2, a1, a0, ada2, ada1, ada0, adcrutes )
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
implicit none
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 one
|
|
parameter ( one = 1.d0 )
|
|
real*8 one3rd
|
|
parameter ( one3rd = 0.333333333d0 )
|
|
real*8 sqrt3
|
|
parameter ( sqrt3 = 1.732050808d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
real*8 a0
|
|
real*8 a1
|
|
real*8 a2
|
|
real*8 ada0
|
|
real*8 ada1
|
|
real*8 ada2
|
|
real*8 adcrutes(3)
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real*8 a2sq
|
|
real*8 ada2sq
|
|
real*8 adcosth
|
|
real*8 addum1
|
|
real*8 addum2
|
|
real*8 adpart1
|
|
real*8 adpart2
|
|
real*8 adpart3
|
|
real*8 adphi
|
|
real*8 adqq
|
|
real*8 adrr
|
|
real*8 adrrsq
|
|
real*8 adsinth
|
|
real*8 adtheta
|
|
real*8 adyy1
|
|
real*8 adyy2
|
|
real*8 adyy3
|
|
real*8 costh
|
|
real*8 crutes(3)
|
|
real*8 dum1
|
|
real*8 dum2
|
|
real*8 part1
|
|
real*8 part2
|
|
real*8 part3
|
|
real*8 phi
|
|
real*8 qq
|
|
real*8 rr
|
|
real*8 rrsq
|
|
real*8 sinth
|
|
real*8 theta
|
|
real*8 yy1
|
|
real*8 yy2
|
|
real*8 yy3
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
ada2sq = 0.
|
|
adcosth = 0.
|
|
addum1 = 0.
|
|
addum2 = 0.
|
|
adpart1 = 0.
|
|
adpart2 = 0.
|
|
adpart3 = 0.
|
|
adphi = 0.
|
|
adqq = 0.
|
|
adrr = 0.
|
|
adrrsq = 0.
|
|
adsinth = 0.
|
|
adtheta = 0.
|
|
adyy1 = 0.
|
|
adyy2 = 0.
|
|
adyy3 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
a2sq = a2*a2
|
|
qq = (a2sq-3.d0*a1)/9.d0
|
|
rr = (a2*(2.d0*a2sq-9.d0*a1)+27.d0*a0)/54.d0
|
|
dum1 = qq*qq*qq
|
|
rrsq = rr*rr
|
|
dum2 = dum1-rrsq
|
|
if (dum2 .ge. 0.d0) then
|
|
phi = sqrt(dum1)
|
|
if (abs(phi) .lt. 1.d-20) then
|
|
crutes(1) = 0.d0
|
|
crutes(2) = 0.d0
|
|
crutes(3) = 0.d0
|
|
endif
|
|
theta = acos(rr/phi)/3.d0
|
|
costh = cos(theta)
|
|
sinth = sin(theta)
|
|
part1 = sqrt(qq)
|
|
yy1 = part1*costh
|
|
yy2 = yy1-a2/3.d0
|
|
yy3 = sqrt3*part1*sinth
|
|
crutes(3) = (-(2.d0*yy1))-a2/3.d0
|
|
crutes(2) = yy2+yy3
|
|
crutes(1) = yy2-yy3
|
|
if (crutes(1) .lt. 0.d0) then
|
|
crutes(1) = 1.d+9
|
|
endif
|
|
if (crutes(2) .lt. 0.d0) then
|
|
crutes(2) = 1.d+9
|
|
endif
|
|
if (crutes(3) .lt. 0.d0) then
|
|
crutes(3) = 1.d+9
|
|
endif
|
|
adcrutes(2) = adcrutes(2)+adcrutes(1)*(0.5-sign(0.5d0,crutes(2)-
|
|
$crutes(1)))
|
|
adcrutes(1) = adcrutes(1)*(0.5+sign(0.5d0,crutes(2)-crutes(1)))
|
|
crutes(1) = yy2-yy3
|
|
if (crutes(1) .lt. 0.d0) then
|
|
crutes(1) = 1.d+9
|
|
endif
|
|
if (crutes(2) .lt. 0.d0) then
|
|
crutes(2) = 1.d+9
|
|
endif
|
|
if (crutes(3) .lt. 0.d0) then
|
|
adcrutes(3) = 0.
|
|
endif
|
|
crutes(1) = yy2-yy3
|
|
if (crutes(1) .lt. 0.d0) then
|
|
crutes(1) = 1.d+9
|
|
endif
|
|
if (crutes(2) .lt. 0.d0) then
|
|
adcrutes(2) = 0.
|
|
endif
|
|
crutes(1) = yy2-yy3
|
|
if (crutes(1) .lt. 0.d0) then
|
|
adcrutes(1) = 0.
|
|
endif
|
|
adyy2 = adyy2+adcrutes(1)
|
|
adyy3 = adyy3-adcrutes(1)
|
|
adcrutes(1) = 0.
|
|
adyy2 = adyy2+adcrutes(2)
|
|
adyy3 = adyy3+adcrutes(2)
|
|
adcrutes(2) = 0.
|
|
ada2 = ada2-0.333333333333d0*adcrutes(3)
|
|
adyy1 = adyy1-2*adcrutes(3)
|
|
adcrutes(3) = 0.
|
|
adpart1 = adpart1+adyy3*sqrt3*sinth
|
|
adsinth = adsinth+adyy3*sqrt3*part1
|
|
adyy3 = 0.
|
|
ada2 = ada2-0.333333333333d0*adyy2
|
|
adyy1 = adyy1+adyy2
|
|
adyy2 = 0.
|
|
adcosth = adcosth+adyy1*part1
|
|
adpart1 = adpart1+adyy1*costh
|
|
adyy1 = 0.
|
|
adqq = adqq+adpart1*(1./(2.*sqrt(qq)))
|
|
adpart1 = 0.
|
|
adtheta = adtheta+adsinth*cos(theta)
|
|
adsinth = 0.
|
|
adtheta = adtheta-adcosth*sin(theta)
|
|
adcosth = 0.
|
|
adphi = adphi+adtheta*(1./sqrt(1.-(rr/phi)**2)*(rr/(phi*phi))/
|
|
$3.d0)
|
|
adrr = adrr-adtheta*(1./sqrt(1.-(rr/phi)**2)/phi/3.d0)
|
|
adtheta = 0.
|
|
if (abs(phi) .lt. 1.d-20) then
|
|
adcrutes(3) = 0.
|
|
adcrutes(2) = 0.
|
|
adcrutes(1) = 0.
|
|
endif
|
|
addum1 = addum1+adphi*(1./(2.*sqrt(dum1)))
|
|
adphi = 0.
|
|
else
|
|
part1 = sqrt(rrsq-dum1)
|
|
part2 = abs(rr)
|
|
part3 = (part1+part2)**one3rd
|
|
adcrutes(3) = 0.
|
|
adcrutes(2) = 0.
|
|
ada2 = ada2-0.333333333333d0*adcrutes(1)
|
|
adpart3 = adpart3-adcrutes(1)*(1-qq/(part3*part3))*sign(one,rr)
|
|
adqq = adqq-adcrutes(1)/part3*sign(one,rr)
|
|
adcrutes(1) = 0.
|
|
adpart1 = adpart1+adpart3*one3rd*(part1+part2)**(one3rd-1)
|
|
adpart2 = adpart2+adpart3*one3rd*(part1+part2)**(one3rd-1)
|
|
adpart3 = 0.
|
|
adrr = adrr+adpart2*sign(1.d0,rr)
|
|
adpart2 = 0.
|
|
addum1 = addum1-adpart1*(1./(2.*sqrt(rrsq-dum1)))
|
|
adrrsq = adrrsq+adpart1*(1./(2.*sqrt(rrsq-dum1)))
|
|
adpart1 = 0.
|
|
endif
|
|
addum1 = addum1+addum2
|
|
adrrsq = adrrsq-addum2
|
|
addum2 = 0.
|
|
adrr = adrr+2*adrrsq*rr
|
|
adrrsq = 0.
|
|
adqq = adqq+3*addum1*qq*qq
|
|
addum1 = 0.
|
|
ada0 = ada0+0.5d0*adrr
|
|
ada1 = ada1+adrr*((-9)*a2/54.d0)
|
|
ada2 = ada2+adrr*((2.d0*a2sq-9.d0*a1)/54.d0)
|
|
ada2sq = ada2sq+adrr*(2*a2/54.d0)
|
|
adrr = 0.
|
|
ada1 = ada1-0.333333333333d0*adqq
|
|
ada2sq = ada2sq+0.111111111111d0*adqq
|
|
adqq = 0.
|
|
ada2 = ada2+2*ada2sq*a2
|
|
ada2sq = 0.
|
|
|
|
end SUBROUTINE ADCUBIC
|
|
!------------------------------------------------------------------------------
|
|
|
|
subroutine adrpmares_6_D5( in, par, adin, adout,
|
|
& I, J, L )
|
|
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine adrpmares_6_D5 was created using a modified version of
|
|
! rpmares_short6.f which replaced the RETURN structure with a DOWHILE loop.
|
|
! (dkh, 06/01/05)
|
|
!
|
|
! Notes
|
|
! (1 ) The following changes are made to the code returned by TAMC:
|
|
! - Change the routine name
|
|
! - Expand argument list to include I, J, L
|
|
! - Eliminate the OUT variable as we are not returning results of fwd
|
|
! calculation from this subroutine.
|
|
! - Replace reference to TAMC storage routines with reference to our
|
|
! checkpointing variables xxx_fwd which are initialized in
|
|
! RECOMP_RPMARES. Comment out the portions of the code that were used
|
|
! to recompute these variables (idow, gamaan, wh2o, ynh4).
|
|
!
|
|
! (2 ) Unlike previous version, don't bother to use checkpointed values of
|
|
! gamanold Can just use gamaan_fwd(I,J,L,idow-1) to restore gamanold.
|
|
!
|
|
!******************************************************************************
|
|
!
|
|
|
|
! Reference to f90 modules
|
|
USE CHECKPT_MOD
|
|
USE RPMARES_MOD, ONLY : CUBIC, AWATER, ACTCOF
|
|
|
|
# include "CMN_SIZE" ! Size params
|
|
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C** This routine was generated by the **
|
|
C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **
|
|
C***************************************************************
|
|
C***************************************************************
|
|
C==============================================
|
|
C all entries are defined explicitly
|
|
C==============================================
|
|
! implicit none
|
|
|
|
C==============================================
|
|
C define parameters
|
|
C==============================================
|
|
real*8 floor
|
|
parameter ( floor = 1.d-30 )
|
|
real*8 mwhno3
|
|
parameter ( mwhno3 = 63.01287d0 )
|
|
real*8 mwnh3
|
|
parameter ( mwnh3 = 17.03061d0 )
|
|
real*8 mwnh4
|
|
parameter ( mwnh4 = 18.03858d0 )
|
|
real*8 mwno3
|
|
parameter ( mwno3 = 62.0049d0 )
|
|
real*8 mwso4
|
|
parameter ( mwso4 = 96.0576d0 )
|
|
|
|
C==============================================
|
|
C define common blocks
|
|
C==============================================
|
|
C==============================================
|
|
C define arguments
|
|
C==============================================
|
|
double precision adin(5)
|
|
double precision adout(8)
|
|
double precision in(5)
|
|
! double precision out(8)
|
|
double precision par(2)
|
|
|
|
C==============================================
|
|
C define local variables
|
|
C==============================================
|
|
real aa
|
|
real adaa
|
|
real*8 adah2o
|
|
real*8 adan(3)
|
|
real*8 adanh4
|
|
real*8 adano3
|
|
real*8 adaso4
|
|
real*8 adbb
|
|
real*8 adcat(2)
|
|
real*8 adcc
|
|
real*8 addd
|
|
real*8 addisc
|
|
real*8 aderor
|
|
real aderori
|
|
real*8 adgamaan
|
|
real*8 adgamold
|
|
real*8 adgams(2,3)
|
|
real*8 adgasqd
|
|
real*8 adgnh3
|
|
real*8 adgno3
|
|
real*8 adkw2
|
|
real*8 adman
|
|
real*8 admas
|
|
real*8 admnh4
|
|
real*8 adrr1
|
|
real*8 adrr2
|
|
real*8 adso4
|
|
real*8 adtmasshno3
|
|
real*8 adtnh4
|
|
real*8 adtno3
|
|
real*8 adtso4
|
|
real*8 adtwoso4
|
|
real*8 adwh2o
|
|
real*8 adwsqd
|
|
real*8 adxno3
|
|
real*8 adxxq
|
|
real*8 adynh4
|
|
real*8 ah2o
|
|
real*8 ahso4
|
|
real*8 an(3)
|
|
real*8 anh4
|
|
real*8 ano3
|
|
real*8 aso4
|
|
real*8 bb
|
|
real*8 cat(2)
|
|
real*8 cc
|
|
logical converged
|
|
real*8 dd
|
|
real*8 disc
|
|
real*8 eror
|
|
real*8 gamaan
|
|
real*8 gamaani
|
|
real*8 gamold
|
|
real*8 gams(2,3)
|
|
real*8 gasqd
|
|
real*8 gnh3
|
|
real*8 gno3
|
|
integer idow
|
|
integer idow2
|
|
integer ip1
|
|
integer ip2
|
|
integer irh
|
|
real*8 k1a
|
|
real*8 kan
|
|
real*8 khat
|
|
real*8 kna
|
|
real*8 kph
|
|
real*8 kw
|
|
real*8 kw2
|
|
real*8 man
|
|
real*8 mas
|
|
real*8 mnh4
|
|
real*8 molnu
|
|
integer ndow
|
|
integer nnn
|
|
real*8 phibar
|
|
real*8 rh
|
|
real*8 rr1
|
|
real*8 rr2
|
|
real*8 so4
|
|
real*8 t1
|
|
real*8 t2
|
|
real*8 t3
|
|
real*8 t4
|
|
real*8 t6
|
|
real*8 temp
|
|
real*8 tmasshno3
|
|
real*8 tnh4
|
|
real*8 tno3
|
|
real*8 toler1
|
|
real*8 tso4
|
|
real*8 twoso4
|
|
real*8 wh2o
|
|
real*8 wh2oi
|
|
real*8 wsqd
|
|
real*8 xno3
|
|
real*8 xxq
|
|
real*8 ynh4
|
|
real*8 ynh4i
|
|
INTEGER I, J, L
|
|
|
|
C----------------------------------------------
|
|
C RESET LOCAL ADJOINT VARIABLES
|
|
C----------------------------------------------
|
|
adaa = 0.
|
|
adah2o = 0.
|
|
do ip1 = 1, 3
|
|
adan(ip1) = 0.
|
|
end do
|
|
adanh4 = 0.
|
|
adano3 = 0.
|
|
adaso4 = 0.
|
|
adbb = 0.
|
|
do ip1 = 1, 2
|
|
adcat(ip1) = 0.
|
|
end do
|
|
adcc = 0.
|
|
addd = 0.
|
|
addisc = 0.
|
|
aderor = 0.
|
|
adgamaan = 0.
|
|
adgamold = 0.
|
|
do ip2 = 1, 3
|
|
do ip1 = 1, 2
|
|
adgams(ip1,ip2) = 0.
|
|
end do
|
|
end do
|
|
adgasqd = 0.
|
|
adgnh3 = 0.
|
|
adgno3 = 0.
|
|
adkw2 = 0.
|
|
adman = 0.
|
|
admas = 0.
|
|
admnh4 = 0.
|
|
adrr1 = 0.
|
|
adrr2 = 0.
|
|
adso4 = 0.
|
|
adtmasshno3 = 0.
|
|
adtnh4 = 0.
|
|
adtno3 = 0.
|
|
adtso4 = 0.
|
|
adtwoso4 = 0.
|
|
adwh2o = 0.
|
|
adwsqd = 0.
|
|
adxno3 = 0.
|
|
adxxq = 0.
|
|
adynh4 = 0.
|
|
|
|
C----------------------------------------------
|
|
C ROUTINE BODY
|
|
C----------------------------------------------
|
|
C----------------------------------------------
|
|
C FUNCTION AND TAPE COMPUTATIONS
|
|
C----------------------------------------------
|
|
so4 = in(1)
|
|
gno3 = in(2)
|
|
gnh3 = in(3)
|
|
ano3 = in(4)
|
|
anh4 = in(5)
|
|
rh = par(1)
|
|
temp = par(2)
|
|
tso4 = max(floor,so4/mwso4)
|
|
tno3 = max(0.d0,ano3/mwno3+gno3/mwhno3)
|
|
tnh4 = max(0.d0,gnh3/mwnh3+anh4/mwnh4)
|
|
tmasshno3 = max(0.d0,gno3+ano3)
|
|
irh = nint(100.*rh)
|
|
irh = max(1,irh)
|
|
irh = min(99,irh)
|
|
t6 = 8.2d-11*temp
|
|
t1 = 298.d0/temp
|
|
t2 = log(t1)
|
|
t3 = t1-1.d0
|
|
t4 = 1.d0+t2-t1
|
|
kna = 2511000.d0*exp(29.17d0*t3+16.83d0*t4)*t6
|
|
k1a = 0.00001805d0*exp((-(1.5d0*t3))+26.92d0*t4)
|
|
kw = 1.01d-14*exp((-(22.52d0*t3))+26.92d0*t4)
|
|
kph = 57.639d0*exp(13.79d0*t3-5.39d0*t4)*t6
|
|
khat = kph*k1a/kw
|
|
kan = kna*khat
|
|
toler1 = 0.00001d0
|
|
gamold = 1.d0
|
|
gamaan = 0.1
|
|
twoso4 = 2.*tso4
|
|
ynh4 = twoso4
|
|
call awater( irh,tso4,ynh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
aso4 = tso4*mwso4
|
|
ahso4 = 0.d0
|
|
ano3 = 0.d0
|
|
anh4 = ynh4*mwnh4
|
|
ynh4 = twoso4
|
|
nnn = 0
|
|
converged = .false.
|
|
idow = 0
|
|
!The following section is used by TAMC to recompute idow.
|
|
!We comment this out and use the values from nitr_max
|
|
! do while (converged .eq. .false. .or. nnn .gt. 50 )
|
|
! idow = idow+1
|
|
! nnn = nnn+1
|
|
! gasqd = gamaan*gamaan
|
|
! wsqd = wh2o*wh2o
|
|
! kw2 = kan*wsqd/gasqd
|
|
! aa = 1.-kw2
|
|
! bb = twoso4+kw2*(tno3+tnh4-twoso4)
|
|
! cc = -(kw2*tno3*(tnh4-twoso4))
|
|
! disc = bb*bb-4.*aa*cc
|
|
! if (aa .ne. 0.d0) then
|
|
! dd = sqrt(disc)
|
|
! xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
! rr1 = xxq/aa
|
|
! rr2 = cc/xxq
|
|
! if (rr1*rr2 .lt. 0.d0) then
|
|
! xno3 = max(rr1,rr2)
|
|
! else
|
|
! xno3 = min(rr1,rr2)
|
|
! endif
|
|
! else
|
|
! xno3 = -(cc/bb)
|
|
! endif
|
|
! xno3 = min(xno3,tno3)
|
|
! call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
! wh2o = 0.001*ah2o
|
|
! man = xno3/wh2o
|
|
! mas = tso4/wh2o
|
|
! mnh4 = 2.*mas+man
|
|
! ynh4 = mnh4*wh2o
|
|
! cat(1) = 0.
|
|
! cat(2) = mnh4
|
|
! an(1) = mas
|
|
! an(2) = man
|
|
! an(3) = 0.
|
|
! call actcof( cat,an,gams,molnu,phibar )
|
|
! gamaan = gams(2,2)
|
|
! eror = abs(gamold-gamaan)/gamold
|
|
! gamold = gamaan
|
|
! if (eror .le. toler1) then
|
|
! aso4 = tso4*mwso4
|
|
! ahso4 = 0.
|
|
! ano3 = xno3*mwno3
|
|
! anh4 = ynh4*mwnh4
|
|
! gno3 = max(floor,tmasshno3-ano3)
|
|
! gnh3 = mwnh3*max(floor,tnh4-ynh4)
|
|
! converged = .true.
|
|
! endif
|
|
! end do
|
|
! call adstore( 'memory_1_rpmares_idow',21,idow,4,1,1 )
|
|
! out(1) = aso4
|
|
! out(2) = ahso4
|
|
! out(3) = ano3
|
|
! out(4) = ah2o
|
|
! out(5) = anh4
|
|
! out(6) = so4
|
|
! out(7) = gno3
|
|
! out(8) = gnh3
|
|
|
|
idow = nitr_max(I,J,L)
|
|
|
|
C----------------------------------------------
|
|
C ADJOINT COMPUTATIONS
|
|
C----------------------------------------------
|
|
ano3 = in(4)
|
|
adgnh3 = adgnh3+adout(8)
|
|
adout(8) = 0.d0
|
|
adgno3 = adgno3+adout(7)
|
|
adout(7) = 0.d0
|
|
adso4 = adso4+adout(6)
|
|
adout(6) = 0.d0
|
|
adanh4 = adanh4+adout(5)
|
|
adout(5) = 0.d0
|
|
adah2o = adah2o+adout(4)
|
|
adout(4) = 0.d0
|
|
adano3 = adano3+adout(3)
|
|
adout(3) = 0.d0
|
|
adout(2) = 0.d0
|
|
adaso4 = adaso4+adout(1)
|
|
adout(1) = 0.d0
|
|
!call adresto( 'memory_1_rpmares_idow',21,idow,4,1,1 )
|
|
ndow = idow
|
|
do idow = ndow, 1, -1
|
|
gamaan = 0.1
|
|
ynh4 = twoso4
|
|
call awater( irh,tso4,ynh4,tno3,ah2o )
|
|
wh2o = 0.001d0*ah2o
|
|
ynh4 = twoso4
|
|
! The following section is used to recompute gamaan, ynh4 and
|
|
! wh20 at each iteration. Instead, comment this out and use
|
|
! the checkpointed variables xxx_fwd.
|
|
! do idow2 = 1, idow-1
|
|
! gasqd = gamaan*gamaan
|
|
! wsqd = wh2o*wh2o
|
|
! kw2 = kan*wsqd/gasqd
|
|
! aa = 1.-kw2
|
|
! bb = twoso4+kw2*(tno3+tnh4-twoso4)
|
|
! cc = -(kw2*tno3*(tnh4-twoso4))
|
|
! disc = bb*bb-4.*aa*cc
|
|
! if (aa .ne. 0.d0) then
|
|
! dd = sqrt(disc)
|
|
! xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
! rr1 = xxq/aa
|
|
! rr2 = cc/xxq
|
|
! if (rr1*rr2 .lt. 0.d0) then
|
|
! xno3 = max(rr1,rr2)
|
|
! else
|
|
! xno3 = min(rr1,rr2)
|
|
! endif
|
|
! else
|
|
! xno3 = -(cc/bb)
|
|
! endif
|
|
! xno3 = min(xno3,tno3)
|
|
! call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
! wh2o = 0.001*ah2o
|
|
! man = xno3/wh2o
|
|
! mas = tso4/wh2o
|
|
! mnh4 = 2.*mas+man
|
|
! ynh4 = mnh4*wh2o
|
|
! cat(1) = 0.
|
|
! cat(2) = mnh4
|
|
! an(1) = mas
|
|
! an(2) = man
|
|
! an(3) = 0.
|
|
! call actcof( cat,an,gams,molnu,phibar )
|
|
! gamaan = gams(2,2)
|
|
! gamold = gamaan
|
|
! end do
|
|
IF ( idow .gt. 1 ) THEN
|
|
gamaan = gamaan_fwd(I,J,L,idow-1)
|
|
wh2o = wh2o_fwd(I,J,L,idow-1)
|
|
ynh4 = ynh4_fwd(I,J,L,idow-1)
|
|
ENDIF
|
|
gamold = gamaan
|
|
ynh4i = ynh4
|
|
wh2oi = wh2o
|
|
gamaani = gamaan
|
|
gasqd = gamaan*gamaan
|
|
wsqd = wh2o*wh2o
|
|
kw2 = kan*wsqd/gasqd
|
|
aa = 1.-kw2
|
|
bb = twoso4+kw2*(tno3+tnh4-twoso4)
|
|
cc = -(kw2*tno3*(tnh4-twoso4))
|
|
disc = bb*bb-4.*aa*cc
|
|
if (aa .ne. 0.d0) then
|
|
dd = sqrt(disc)
|
|
xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
rr1 = xxq/aa
|
|
rr2 = cc/xxq
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
xno3 = max(rr1,rr2)
|
|
else
|
|
xno3 = min(rr1,rr2)
|
|
endif
|
|
else
|
|
xno3 = -(cc/bb)
|
|
endif
|
|
xno3 = min(xno3,tno3)
|
|
call awater( irh,tso4,ynh4,xno3,ah2o )
|
|
wh2o = 0.001*ah2o
|
|
man = xno3/wh2o
|
|
mas = tso4/wh2o
|
|
mnh4 = 2.*mas+man
|
|
ynh4 = mnh4*wh2o
|
|
cat(1) = 0.
|
|
cat(2) = mnh4
|
|
an(1) = mas
|
|
an(2) = man
|
|
an(3) = 0.
|
|
call actcof( cat,an,gams,molnu,phibar )
|
|
gamaan = gams(2,2)
|
|
eror = abs(gamold-gamaan)/gamold
|
|
if (eror .le. toler1) then
|
|
ano3 = xno3*mwno3
|
|
adwh2o = adwh2o+1000*adah2o
|
|
adah2o = 0.
|
|
adtnh4 = adtnh4+adgnh3*mwnh3*(0.5-sign(0.5,floor-(tnh4-ynh4)))
|
|
adynh4 = adynh4-adgnh3*mwnh3*(0.5-sign(0.5,floor-(tnh4-ynh4)))
|
|
adgnh3 = 0.
|
|
adano3 = adano3-adgno3*(0.5-sign(0.5,floor-(tmasshno3-ano3)))
|
|
adtmasshno3 = adtmasshno3+adgno3*(0.5-sign(0.5,floor-
|
|
$(tmasshno3-ano3)))
|
|
adgno3 = 0.
|
|
adynh4 = adynh4+adanh4*mwnh4
|
|
adanh4 = 0.
|
|
adxno3 = adxno3+adano3*mwno3
|
|
adano3 = 0.
|
|
adtso4 = adtso4+adaso4*mwso4
|
|
adaso4 = 0.
|
|
endif
|
|
adgamaan = adgamaan+adgamold
|
|
adgamold = 0.
|
|
aderori = aderor/gamold
|
|
adgamold = adgamold-aderor*(abs(gamold-gamaan)/(gamold*gamold))
|
|
adgamaan = adgamaan-aderori*sign(1.,gamold-gamaan)
|
|
adgamold = adgamold+aderori*sign(1.,gamold-gamaan)
|
|
aderor = 0.
|
|
adgams(2,2) = adgams(2,2)+adgamaan
|
|
adgamaan = 0.
|
|
call adactcof( cat,an,adcat,adan,adgams )
|
|
adan(3) = 0.
|
|
adman = adman+adan(2)
|
|
adan(2) = 0.
|
|
admas = admas+adan(1)
|
|
adan(1) = 0.
|
|
admnh4 = admnh4+adcat(2)
|
|
adcat(2) = 0.
|
|
adcat(1) = 0.
|
|
admnh4 = admnh4+adynh4*wh2o
|
|
adwh2o = adwh2o+adynh4*mnh4
|
|
adynh4 = 0.
|
|
adman = adman+admnh4
|
|
admas = admas+2*admnh4
|
|
admnh4 = 0.
|
|
adtso4 = adtso4+admas/wh2o
|
|
adwh2o = adwh2o-admas*(tso4/(wh2o*wh2o))
|
|
admas = 0.
|
|
adwh2o = adwh2o-adman*(xno3/(wh2o*wh2o))
|
|
adxno3 = adxno3+adman/wh2o
|
|
adman = 0.
|
|
adah2o = adah2o+0.001*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = ynh4i
|
|
call adawater( irh,tso4,ynh4,xno3,adtso4,adynh4,adxno3,adah2o )
|
|
if (aa .ne. 0.d0) then
|
|
dd = sqrt(disc)
|
|
xxq = -(0.5d0*(bb+sign(1.d0,bb)*dd))
|
|
rr1 = xxq/aa
|
|
rr2 = cc/xxq
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
xno3 = max(rr1,rr2)
|
|
else
|
|
xno3 = min(rr1,rr2)
|
|
endif
|
|
else
|
|
xno3 = -(cc/bb)
|
|
endif
|
|
adtno3 = adtno3+adxno3*(0.5-sign(0.5,tno3-xno3))
|
|
adxno3 = adxno3*(0.5+sign(0.5,tno3-xno3))
|
|
if (aa .ne. 0.d0) then
|
|
if (rr1*rr2 .lt. 0.d0) then
|
|
adrr1 = adrr1+adxno3*(0.5+sign(0.5,rr1-rr2))
|
|
adrr2 = adrr2+adxno3*(0.5-sign(0.5,rr1-rr2))
|
|
adxno3 = 0.
|
|
else
|
|
adrr1 = adrr1+adxno3*(0.5+sign(0.5,rr2-rr1))
|
|
adrr2 = adrr2+adxno3*(0.5-sign(0.5,rr2-rr1))
|
|
adxno3 = 0.
|
|
endif
|
|
adcc = adcc+adrr2/xxq
|
|
adxxq = adxxq-adrr2*(cc/(xxq*xxq))
|
|
adrr2 = 0.
|
|
adaa = adaa-adrr1*(xxq/(aa*aa))
|
|
adxxq = adxxq+adrr1/aa
|
|
adrr1 = 0.
|
|
adbb = adbb-0.5d0*adxxq
|
|
addd = addd-0.5d0*adxxq*sign(1.d0,bb)
|
|
adxxq = 0.
|
|
addisc = addisc+addd*(1./(2.*sqrt(disc)))
|
|
addd = 0.
|
|
else
|
|
adbb = adbb+adxno3*(cc/(bb*bb))
|
|
adcc = adcc-adxno3/bb
|
|
adxno3 = 0.
|
|
endif
|
|
adaa = adaa-4*addisc*cc
|
|
adbb = adbb+2*addisc*bb
|
|
adcc = adcc-4*addisc*aa
|
|
addisc = 0.
|
|
adkw2 = adkw2-adcc*tno3*(tnh4-twoso4)
|
|
adtnh4 = adtnh4-adcc*kw2*tno3
|
|
adtno3 = adtno3-adcc*kw2*(tnh4-twoso4)
|
|
adtwoso4 = adtwoso4+adcc*kw2*tno3
|
|
adcc = 0.
|
|
adkw2 = adkw2+adbb*(tno3+tnh4-twoso4)
|
|
adtnh4 = adtnh4+adbb*kw2
|
|
adtno3 = adtno3+adbb*kw2
|
|
adtwoso4 = adtwoso4+adbb*(1-kw2)
|
|
adbb = 0.
|
|
adkw2 = adkw2-adaa
|
|
adaa = 0.
|
|
adgasqd = adgasqd-adkw2*(kan*wsqd/(gasqd*gasqd))
|
|
adwsqd = adwsqd+adkw2*(kan/gasqd)
|
|
adkw2 = 0.
|
|
wh2o = wh2oi
|
|
adwh2o = adwh2o+2*adwsqd*wh2o
|
|
adwsqd = 0.
|
|
gamaan = gamaani
|
|
adgamaan = adgamaan+2*adgasqd*gamaan
|
|
adgasqd = 0.
|
|
end do
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adah2o = adah2o+0.001d0*adwh2o
|
|
adwh2o = 0.
|
|
ynh4 = twoso4
|
|
call adawater( irh,tso4,ynh4,tno3,adtso4,adynh4,adtno3,adah2o )
|
|
adtwoso4 = adtwoso4+adynh4
|
|
adynh4 = 0.
|
|
adtso4 = adtso4+2*adtwoso4
|
|
adtwoso4 = 0.
|
|
ano3 = in(4)
|
|
adano3 = adano3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adgno3 = adgno3+adtmasshno3*(0.5-sign(0.5d0,0.d0-(gno3+ano3)))
|
|
adtmasshno3 = 0.
|
|
anh4 = in(5)
|
|
adanh4 = adanh4+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh4)
|
|
adgnh3 = adgnh3+adtnh4*((0.5-sign(0.5d0,0.d0-(gnh3/mwnh3+anh4/
|
|
$mwnh4)))/mwnh3)
|
|
adtnh4 = 0.
|
|
adano3 = adano3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwno3)
|
|
adgno3 = adgno3+adtno3*((0.5-sign(0.5d0,0.d0-(ano3/mwno3+gno3/
|
|
$mwhno3)))/mwhno3)
|
|
adtno3 = 0.
|
|
adso4 = adso4+adtso4*((0.5-sign(0.5,floor-so4/mwso4))/mwso4)
|
|
adtso4 = 0.
|
|
adin(5) = adin(5)+adanh4
|
|
adanh4 = 0.
|
|
adin(4) = adin(4)+adano3
|
|
adano3 = 0.
|
|
adin(3) = adin(3)+adgnh3
|
|
adgnh3 = 0.
|
|
adin(2) = adin(2)+adgno3
|
|
adgno3 = 0.
|
|
adin(1) = adin(1)+adso4
|
|
adso4 = 0.
|
|
|
|
|
|
end SUBROUTINE ADRPMARES_6_D5
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
! End of module
|
|
END MODULE RPMARES_ADJ_MOD
|