1 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 ! Driver for the Adjoint (ADJ) model
3 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 PROGRAM KPP_ROOT_ADJ_Driver
8 USE KPP_ROOT_Initialize
, ONLY
: Initialize
10 KPP_REAL
:: T
, DVAL(NSPEC
)
11 INTEGER :: i
, j
, ind_1
= 1, ind_2
= 2
12 ! INTEGER :: ind_1 = ind_NO2, ind_2 = ind_O3
14 ! --- Number of functional for which sensitivities are computed
15 ! --- Note: this value is set for sensitivities w.r.t. all initial values
16 ! --- it may have to be changed for other applications
19 KPP_REAL
Y_ADJ(NVAR
,NADJ
)
21 ! ---- TIME VARIABLES ------------------
33 !~~~> Note: the initial values below are adjoint values at the final time
34 Y_ADJ(1:NVAR
,1:NADJ
) = 0.0d0
35 Y_ADJ(ind_1
,1) = 1.0d0
36 Y_ADJ(ind_2
,2) = 1.0d0
38 ! ~~~~~~~~~ BEGIN TIME LOOP ~~~~~~~~~~
44 CALL GetMass( C
, DVAL
)
45 WRITE(6,991) (T
-TSTART
)/(TEND
-TSTART
)*100, T
, &
46 (TRIM(SPC_NAMES(MONITOR(i
))), &
47 C(MONITOR(i
))/CFACTOR
, i
=1,NMONITOR
), &
48 (TRIM(SMASS(i
)),DVAL(i
)/CFACTOR
, i
=1,NMASS
)
52 CALL INTEGRATE_ADJ( NADJ
, VAR
, Y_ADJ
, T
, TEND
)
55 CALL GetMass( C
, DVAL
)
56 WRITE(6,991) (TEND
-TSTART
)/(TEND
-TSTART
)*100, TEND
, &
57 (TRIM(SPC_NAMES(MONITOR(i
))), &
58 C(MONITOR(i
))/CFACTOR
, i
=1,NMONITOR
), &
59 (TRIM(SMASS(i
)),DVAL(i
)/CFACTOR
, i
=1,NMASS
)
63 ! ~~~~~~~~~ END TIME LOOP ~~~~~~~~~~
65 OPEN(20, FILE
='KPP_ROOT_ADJ_results.m')
66 WRITE(6,*) '**************************************************'
67 WRITE(6,*) ' Concentrations and Sensitivities at final time '
68 WRITE(6,*) ' were written in the file KPP_ROOT_ADJ_results.m'
69 WRITE(6,*) '**************************************************'
71 WRITE(20,993) ( Y_ADJ(i
,j
), i
=1,NVAR
)
74 WRITE(6,995) TRIM(SPC_NAMES(ind_1
)),TRIM(SPC_NAMES(ind_1
)), &
76 WRITE(6,995) TRIM(SPC_NAMES(ind_2
)),TRIM(SPC_NAMES(ind_2
)), &
78 WRITE(6,995) TRIM(SPC_NAMES(ind_2
)),TRIM(SPC_NAMES(ind_1
)), &
80 WRITE(6,995) TRIM(SPC_NAMES(ind_1
)),TRIM(SPC_NAMES(ind_2
)), &
85 991 FORMAT(F6
.1
,'%. T=',E10
.3
,3X
,20(A
,'=',E10
.4
,';',1X
))
86 993 FORMAT(1000(E24
.16
,2X
))
87 995 FORMAT('ADJ: d[',A
,'](tf)/d[',A
,'](t0)=',E14
.7
)
89 END PROGRAM KPP_ROOT_ADJ_Driver