Changeset 5098 for LMDZ6/branches/Amaury_dev/libf/dyn3d_common/infotrac.F90
- Timestamp:
- Jul 22, 2024, 6:53:44 PM (4 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/infotrac.F90
r5091 r5098 3 3 MODULE infotrac 4 4 5 USE strings_mod, ONLY: msg, fmsg, maxlen, cat, dispTable, int2str, bool2str, strStack, strParse6 USE readTracFiles_mod, ONLY: trac_type, readTracersFiles, tracers, setGeneration, itZonIso, nzone, tran0, isoZone, &7 delPhase, niso, getKey, isot_type, processIsotopes,isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, &8 addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate,iqWIsoPha, nbIso, ntiso, isoName, isoCheck9 10 11 12 13 14 15 16 PUBLIC :: nqtot, nbtr, nqo, nqCO2,nqtottr !--- Main dimensions17 18 19 20 21 22 23 24 25 26 27 28 PUBLIC :: niso, nzone, nphas,ntiso !--- " " numbers + isotopes & tagging tracers number29 30 31 32 33 34 35 !=== CONVENTIONS FOR TRACERS NUMBERS:36 ! |--------------------+-----------------------+-----------------+---------------+----------------------------|37 ! | water in different | water tagging | water isotopes | other tracers | additional tracers moments |38 ! | phases: H2O_[gls] | isotopes | | | for higher order schemes |39 ! |--------------------+-----------------------+-----------------+---------------+----------------------------|40 ! | | | | | |41 ! |<-- nqo -->|<-- nqo*niso* nzone -->|<-- nqo*niso -->|<-- nbtr -->|<-- (nmom) -->| 42 ! | | | |43 ! | |<-- nqo*niso*(nzone+1) = nqo*ntiso -->|<-- nqtottr = nbtr + nmom -->|44 ! | = nqtot - nqo*(ntiso+1) |45 ! | |46 ! |<-- nqtrue = nbtr + nqo*(ntiso+1) -->| |47 ! | |48 ! |<-- nqtot = nqtrue + nmom -->|49 ! | |50 ! |-----------------------------------------------------------------------------------------------------------|51 ! NOTES FOR THIS TABLE:52 ! * Used "niso", "nzone" and "ntiso" are components of "isotopes(ip)" for water (isotopes(ip)%parent == 'H2O'),53 ! since water is so far the sole tracers family, except passive CO2, removed from the main tracers table.54 ! * For water, "nqo" is equal to the more general field "isotopes(ip)%nphas".55 ! * "niso", "nzone", "ntiso", "nphas" are defined for other isotopic tracers families, if any.56 !57 !=== DERIVED TYPE EMBEDDING MOST OF THE TRACERS-RELATED QUANTITIES (LENGTH: nqtot)58 ! Each entry is accessible using "%" sign.59 ! |-------------+------------------------------------------------------+-------------+------------------------+60 ! | entry | Meaning | Former name | Possible values |61 ! |-------------+------------------------------------------------------+-------------+------------------------+62 ! | name | Name (short) | tname | |63 ! | gen0Name | Name of the 1st generation ancestor | / | |64 ! | parent | Name of the parent | / | |65 ! | longName | Long name (with adv. scheme suffix) for outputs | ttext | |66 ! | type | Type (so far: tracer or tag) | / | tracer,tag |67 ! | phase | Phases list ("g"as / "l"iquid / "s"olid) | / | [g][l][s] |68 ! | component | Name(s) of the merged/cumulated section(s) | / | coma-separated names |69 ! | iGeneration | Generation (>=1) | / | |70 ! | iqParent | Index of the parent tracer | iqpere | 1:nqtot |71 ! | iqDescen | Indexes of the childs (all generations) | iqfils | 1:nqtot |72 ! | nqDescen | Number of the descendants (all generations) | nqdesc | 1:nqtot |73 ! | nqChildren | Number of childs (1st generation only) | nqfils | 1:nqtot |74 ! | keys | key/val pairs accessible with "getKey" routine | / | |75 ! | iadv | Advection scheme number | iadv | 1,2,10-20(exc.15,19),30|76 ! | isAdvected | advected tracers flag (.TRUE. if iadv >= 0) | / | nqtrue .TRUE. values |77 ! | isInPhysics | tracers not extracted from the main table in physics | / | nqtottr .TRUE. values |78 ! | iso_iGroup | Isotopes group index in isotopes(:) | / | 1:nbIso |79 ! | iso_iName | Isotope name index in isotopes(iso_iGroup)%trac(:) | iso_indnum | 1:niso |80 ! | iso_iZone | Isotope zone index in isotopes(iso_iGroup)%zone(:) | zone_num | 1:nzone |81 ! | iso_iPhas | Isotope phase index in isotopes(iso_iGroup)%phas(:) | phase_num | 1:nphas |82 ! +-------------+------------------------------------------------------+-------------+------------------------+83 !84 !=== DERIVED TYPE EMBEDDING MOST OF THE ISOTOPES-RELATED QUANTITIES (LENGTH: nbIso, NUMBER OF ISOTOPES FAMILIES)85 ! Each entry is accessible using "%" sign.86 ! |-----------------+--------------------------------------------------+--------------------+-----------------+87 ! | entry | length | Meaning | Former name | Possible values |88 ! |-----------------+--------------------------------------------------+--------------------+-----------------+89 ! | parent | Parent tracer (isotopes family name) | | |90 ! | keys | niso | Isotopes keys/values pairs list + number | | |91 ! | trac | ntiso | Isotopes + tagging tracers list + number | / | ntraciso | |92 ! | zone | nzone | Geographic tagging zones list + number | / | ntraceurs_zone | |93 ! | phase | nphas | Phases list + number | | [g][l][s], 1:3 |94 ! | iqIsoPha | Index in "qx" = f(name(1:ntiso)),phas) | iqiso | 1:nqtot |95 ! | itZonIso | Index in "trac(1:ntiso)"= f(zone, name(1:niso)) | index_trac | 1:ntiso |96 ! +-----------------+--------------------------------------------------+--------------------+-----------------+97 98 99 100 101 INTEGER, SAVE :: nqtot,& !--- Tracers nb in dynamics (incl. higher moments + H2O)102 nbtr,& !--- Tracers nb in physics (excl. higher moments + H2O)103 nqo,& !--- Number of water phases104 105 106 CHARACTER(LEN=maxlen), SAVE :: type_trac !--- Keyword for tracers type107 108 109 INTEGER,SAVE, ALLOCATABLE :: conv_flg(:), & !--- Convection activation ; needed for INCA (nbtr)110 5 USE strings_mod, ONLY : msg, fmsg, maxlen, cat, dispTable, int2str, bool2str, strStack, strParse 6 USE readTracFiles_mod, ONLY : trac_type, readTracersFiles, tracers, setGeneration, itZonIso, nzone, tran0, isoZone, & 7 delPhase, niso, getKey, isot_type, processIsotopes, isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, & 8 addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate, iqWIsoPha, nbIso, ntiso, isoName, isoCheck 9 IMPLICIT NONE 10 11 PRIVATE 12 13 !=== FOR TRACERS: 14 PUBLIC :: init_infotrac !--- Initialization of the tracers 15 PUBLIC :: tracers, type_trac !--- Full tracers database, tracers type keyword 16 PUBLIC :: nqtot, nbtr, nqo, nqCO2, nqtottr !--- Main dimensions 17 PUBLIC :: conv_flg, pbl_flg !--- Convection & boundary layer activation keys 18 19 !=== FOR ISOTOPES: General 20 PUBLIC :: isot_type, nbIso !--- Derived type, full isotopes families database + nb of families 21 PUBLIC :: isoSelect, ixIso !--- Isotopes family selection tool + selected family index 22 !=== FOR ISOTOPES: Specific to water 23 PUBLIC :: iH2O !--- H2O isotopes class index 24 PUBLIC :: min_qParent, min_qMass, min_ratio !--- Min. values for various isotopic quantities 25 !=== FOR ISOTOPES: Depending on the selected isotopes family 26 PUBLIC :: isotope, isoKeys !--- Selected isotopes database + associated keys (cf. getKey) 27 PUBLIC :: isoName, isoZone, isoPhas !--- Isotopes and tagging zones names, phases 28 PUBLIC :: niso, nzone, nphas, ntiso !--- " " numbers + isotopes & tagging tracers number 29 PUBLIC :: itZonIso !--- idx "it" (in "isoName(1:niso)") = function(tagging idx, isotope idx) 30 PUBLIC :: iqIsoPha !--- idx "iq" (in "qx") = function(isotope idx, phase idx) + aliases 31 PUBLIC :: isoCheck !--- Run isotopes checking routines 32 !=== FOR BOTH TRACERS AND ISOTOPES 33 PUBLIC :: getKey !--- Get a key from "tracers" or "isotope" 34 35 !=== CONVENTIONS FOR TRACERS NUMBERS: 36 ! |--------------------+-----------------------+-----------------+---------------+----------------------------| 37 ! | water in different | water tagging | water isotopes | other tracers | additional tracers moments | 38 ! | phases: H2O_[gls] | isotopes | | | for higher order schemes | 39 ! |--------------------+-----------------------+-----------------+---------------+----------------------------| 40 ! | | | | | | 41 ! |<-- nqo -->|<-- nqo*niso* nzone -->|<-- nqo*niso -->|<-- nbtr -->|<-- (nmom) -->| 42 ! | | | | 43 ! | |<-- nqo*niso*(nzone+1) = nqo*ntiso -->|<-- nqtottr = nbtr + nmom -->| 44 ! | = nqtot - nqo*(ntiso+1) | 45 ! | | 46 ! |<-- nqtrue = nbtr + nqo*(ntiso+1) -->| | 47 ! | | 48 ! |<-- nqtot = nqtrue + nmom -->| 49 ! | | 50 ! |-----------------------------------------------------------------------------------------------------------| 51 ! NOTES FOR THIS TABLE: 52 ! * Used "niso", "nzone" and "ntiso" are components of "isotopes(ip)" for water (isotopes(ip)%parent == 'H2O'), 53 ! since water is so far the sole tracers family, except passive CO2, removed from the main tracers table. 54 ! * For water, "nqo" is equal to the more general field "isotopes(ip)%nphas". 55 ! * "niso", "nzone", "ntiso", "nphas" are defined for other isotopic tracers families, if any. 56 ! 57 !=== DERIVED TYPE EMBEDDING MOST OF THE TRACERS-RELATED QUANTITIES (LENGTH: nqtot) 58 ! Each entry is accessible using "%" sign. 59 ! |-------------+------------------------------------------------------+-------------+------------------------+ 60 ! | entry | Meaning | Former name | Possible values | 61 ! |-------------+------------------------------------------------------+-------------+------------------------+ 62 ! | name | Name (short) | tname | | 63 ! | gen0Name | Name of the 1st generation ancestor | / | | 64 ! | parent | Name of the parent | / | | 65 ! | longName | Long name (with adv. scheme suffix) for outputs | ttext | | 66 ! | type | Type (so far: tracer or tag) | / | tracer,tag | 67 ! | phase | Phases list ("g"as / "l"iquid / "s"olid) | / | [g][l][s] | 68 ! | component | Name(s) of the merged/cumulated section(s) | / | coma-separated names | 69 ! | iGeneration | Generation (>=1) | / | | 70 ! | iqParent | Index of the parent tracer | iqpere | 1:nqtot | 71 ! | iqDescen | Indexes of the childs (all generations) | iqfils | 1:nqtot | 72 ! | nqDescen | Number of the descendants (all generations) | nqdesc | 1:nqtot | 73 ! | nqChildren | Number of childs (1st generation only) | nqfils | 1:nqtot | 74 ! | keys | key/val pairs accessible with "getKey" routine | / | | 75 ! | iadv | Advection scheme number | iadv | 1,2,10-20(exc.15,19),30| 76 ! | isAdvected | advected tracers flag (.TRUE. if iadv >= 0) | / | nqtrue .TRUE. values | 77 ! | isInPhysics | tracers not extracted from the main table in physics | / | nqtottr .TRUE. values | 78 ! | iso_iGroup | Isotopes group index in isotopes(:) | / | 1:nbIso | 79 ! | iso_iName | Isotope name index in isotopes(iso_iGroup)%trac(:) | iso_indnum | 1:niso | 80 ! | iso_iZone | Isotope zone index in isotopes(iso_iGroup)%zone(:) | zone_num | 1:nzone | 81 ! | iso_iPhas | Isotope phase index in isotopes(iso_iGroup)%phas(:) | phase_num | 1:nphas | 82 ! +-------------+------------------------------------------------------+-------------+------------------------+ 83 ! 84 !=== DERIVED TYPE EMBEDDING MOST OF THE ISOTOPES-RELATED QUANTITIES (LENGTH: nbIso, NUMBER OF ISOTOPES FAMILIES) 85 ! Each entry is accessible using "%" sign. 86 ! |-----------------+--------------------------------------------------+--------------------+-----------------+ 87 ! | entry | length | Meaning | Former name | Possible values | 88 ! |-----------------+--------------------------------------------------+--------------------+-----------------+ 89 ! | parent | Parent tracer (isotopes family name) | | | 90 ! | keys | niso | Isotopes keys/values pairs list + number | | | 91 ! | trac | ntiso | Isotopes + tagging tracers list + number | / | ntraciso | | 92 ! | zone | nzone | Geographic tagging zones list + number | / | ntraceurs_zone | | 93 ! | phase | nphas | Phases list + number | | [g][l][s], 1:3 | 94 ! | iqIsoPha | Index in "qx" = f(name(1:ntiso)),phas) | iqiso | 1:nqtot | 95 ! | itZonIso | Index in "trac(1:ntiso)"= f(zone, name(1:niso)) | index_trac | 1:ntiso | 96 ! +-----------------+--------------------------------------------------+--------------------+-----------------+ 97 98 REAL, PARAMETER :: min_qParent = 1.e-30, min_qMass = 1.e-18, min_ratio = 1.e-16 ! MVals et CRisi 99 100 !=== DIMENSIONS OF THE TRACERS TABLES AND OTHER SCALAR VARIABLES 101 INTEGER, SAVE :: nqtot, & !--- Tracers nb in dynamics (incl. higher moments + H2O) 102 nbtr, & !--- Tracers nb in physics (excl. higher moments + H2O) 103 nqo, & !--- Number of water phases 104 nqtottr, & !--- Number of tracers passed to phytrac (TO BE DELETED ?) 105 nqCO2 !--- Number of tracers of CO2 (ThL) 106 CHARACTER(LEN = maxlen), SAVE :: type_trac !--- Keyword for tracers type 107 108 !=== VARIABLES FOR INCA 109 INTEGER, SAVE, ALLOCATABLE :: conv_flg(:), & !--- Convection activation ; needed for INCA (nbtr) 110 pbl_flg(:) !--- Boundary layer activation ; needed for INCA (nbtr) 111 111 112 112 CONTAINS 113 113 114 SUBROUTINE init_infotrac115 USE control_mod, ONLY: planet_type114 SUBROUTINE init_infotrac 115 USE control_mod, ONLY : planet_type 116 116 #ifdef REPROBUS 117 117 USE CHEM_REP, ONLY: Init_chem_rep_trac 118 118 #endif 119 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA120 IMPLICIT NONE121 !==============================================================================================================================122 !123 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin124 ! -------125 !126 ! Modifications:127 ! --------------128 ! 05/94: F.Forget Modif special traceur129 ! 02/02: M-A Filiberti Lecture de traceur.def130 ! 01/22: D. Cugnet Nouveaux tracer.def et tracer_*.def + encapsulation (types trac_type et isot_type)131 !132 ! Objet:133 ! ------134 ! GCM LMD nouvelle grille135 !136 !==============================================================================================================================137 ! ... modification de l'integration de q ( 26/04/94 ) ....138 !------------------------------------------------------------------------------------------------------------------------------139 ! Declarations:140 INCLUDE "dimensions.h"141 INCLUDE "iniprint.h"142 143 !------------------------------------------------------------------------------------------------------------------------------144 ! Local variables145 INTEGER, ALLOCATABLE :: hadv(:), vadv(:) !--- Horizontal/vertical transport scheme number146 INTEGER, ALLOCATABLE :: had (:), hadv_inca(:), conv_flg_inca(:), &!--- Variables specific to INCA147 vad (:), vadv_inca(:),pbl_flg_inca(:)148 CHARACTER(LEN=8), ALLOCATABLE :: solsym_inca(:) !--- Tracers names for INCA149 INTEGER :: nqINCA150 CHARACTER(LEN=2) ::suff(9) !--- Suffixes for schemes of order 3 or 4 (Prather)151 CHARACTER(LEN=3):: descrq(30) !--- Advection scheme description tags152 CHARACTER(LEN=maxlen) :: msg1, texp, ttp !--- Strings for messages and expanded tracers type153 INTEGER :: fType !--- Tracers description file type ; 0: none154 155 INTEGER :: nqtrue !--- Tracers nb from tracer.def (no higher order moments)156 INTEGER :: iad !--- Advection scheme number157 INTEGER :: iq, jq, nt, im, nm !--- Indexes and temporary variables158 LOGICAL :: lerr, ll159 TYPE(trac_type), ALLOCATABLE, TARGET :: ttr(:)160 TYPE(trac_type), POINTER:: t1, t(:)161 CHARACTER(LEN=maxlen),ALLOCATABLE :: types_trac(:) !--- Keyword for tracers type(s), parsed version162 163 CHARACTER(LEN=*), PARAMETER :: modname="init_infotrac"164 !------------------------------------------------------------------------------------------------------------------------------165 ! Initialization :166 !------------------------------------------------------------------------------------------------------------------------------167 suff = ['x ','y ','z ','xx','xy','xz','yy','yz','zz']168 descrq( 1:30) =' '169 descrq( 1: 2) = ['LMV','BAK']170 descrq(10:20) = ['VL1','VLP','FH1','FH2','VLH',' ','PPM','PPS','PPP',' ','SLP']171 descrq(30) ='PRA'172 173 CALL msg('type_trac = "'//TRIM(type_trac)//'"', modname)174 175 lerr=strParse(type_trac, '|', types_trac, n=nt)176 IF (nt > 1) THEN119 USE lmdz_cppkeys_wrapper, ONLY : CPPKEY_INCA, CPPKEY_STRATAER 120 IMPLICIT NONE 121 !============================================================================================================================== 122 ! 123 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin 124 ! ------- 125 ! 126 ! Modifications: 127 ! -------------- 128 ! 05/94: F.Forget Modif special traceur 129 ! 02/02: M-A Filiberti Lecture de traceur.def 130 ! 01/22: D. Cugnet Nouveaux tracer.def et tracer_*.def + encapsulation (types trac_type et isot_type) 131 ! 132 ! Objet: 133 ! ------ 134 ! GCM LMD nouvelle grille 135 ! 136 !============================================================================================================================== 137 ! ... modification de l'integration de q ( 26/04/94 ) .... 138 !------------------------------------------------------------------------------------------------------------------------------ 139 ! Declarations: 140 INCLUDE "dimensions.h" 141 INCLUDE "iniprint.h" 142 143 !------------------------------------------------------------------------------------------------------------------------------ 144 ! Local variables 145 INTEGER, ALLOCATABLE :: hadv(:), vadv(:) !--- Horizontal/vertical transport scheme number 146 INTEGER, ALLOCATABLE :: had (:), hadv_inca(:), conv_flg_inca(:), &!--- Variables specific to INCA 147 vad (:), vadv_inca(:), pbl_flg_inca(:) 148 CHARACTER(LEN = 8), ALLOCATABLE :: solsym_inca(:) !--- Tracers names for INCA 149 INTEGER :: nqINCA 150 CHARACTER(LEN = 2) :: suff(9) !--- Suffixes for schemes of order 3 or 4 (Prather) 151 CHARACTER(LEN = 3) :: descrq(30) !--- Advection scheme description tags 152 CHARACTER(LEN = maxlen) :: msg1, texp, ttp !--- Strings for messages and expanded tracers type 153 INTEGER :: fType !--- Tracers description file type ; 0: none 154 !--- 1/2/3: "traceur.def"/"tracer.def"/"tracer_*.def" 155 INTEGER :: nqtrue !--- Tracers nb from tracer.def (no higher order moments) 156 INTEGER :: iad !--- Advection scheme number 157 INTEGER :: iq, jq, nt, im, nm !--- Indexes and temporary variables 158 LOGICAL :: lerr, ll 159 TYPE(trac_type), ALLOCATABLE, TARGET :: ttr(:) 160 TYPE(trac_type), POINTER :: t1, t(:) 161 CHARACTER(LEN = maxlen), ALLOCATABLE :: types_trac(:) !--- Keyword for tracers type(s), parsed version 162 163 CHARACTER(LEN = *), PARAMETER :: modname = "init_infotrac" 164 !------------------------------------------------------------------------------------------------------------------------------ 165 ! Initialization : 166 !------------------------------------------------------------------------------------------------------------------------------ 167 suff = ['x ', 'y ', 'z ', 'xx', 'xy', 'xz', 'yy', 'yz', 'zz'] 168 descrq(1:30) = ' ' 169 descrq(1:2) = ['LMV', 'BAK'] 170 descrq(10:20) = ['VL1', 'VLP', 'FH1', 'FH2', 'VLH', ' ', 'PPM', 'PPS', 'PPP', ' ', 'SLP'] 171 descrq(30) = 'PRA' 172 173 CALL msg('type_trac = "' // TRIM(type_trac) // '"', modname) 174 175 lerr = strParse(type_trac, '|', types_trac, n = nt) 176 IF (nt > 1) THEN 177 177 IF (nt > 2) CALL abort_gcm(modname, 'you need to modify type_trac, this version is not supported by lmdz', 1) 178 if (nt == 2) type_trac =types_trac(2)179 ENDIF180 181 182 183 !--- MESSAGE ABOUT THE CHOSEN CONFIGURATION184 msg1 = 'For type_trac = "'//TRIM(type_trac)//'":'185 SELECT CASE(type_trac)186 CASE('inca'); CALL msg(TRIM(msg1)//' coupling with INCA chemistry model',modname)187 CASE('inco'); CALL msg(TRIM(msg1)//' coupling jointly with INCA and CO2 cycle',modname)188 CASE('repr'); CALL msg(TRIM(msg1)//' coupling with REPROBUS chemistry model',modname)189 CASE('co2i'); CALL msg(TRIM(msg1)//' you have chosen to run with CO2 cycle',modname)190 CASE('coag'); CALL msg(TRIM(msg1)//' tracers are treated for COAGULATION tests', modname)191 CASE('lmdz'); CALL msg(TRIM(msg1)//' tracers are treated in LMDZ only',modname)192 CASE DEFAULT; CALL abort_gcm(modname,'type_trac='//TRIM(type_trac)//' not possible yet.',1)193 END SELECT194 195 !--- COHERENCE TEST BETWEEN "type_trac" AND PREPROCESSING KEYS196 SELECT CASE(type_trac)197 178 if (nt == 2) type_trac = types_trac(2) 179 ENDIF 180 181 182 183 !--- MESSAGE ABOUT THE CHOSEN CONFIGURATION 184 msg1 = 'For type_trac = "' // TRIM(type_trac) // '":' 185 SELECT CASE(type_trac) 186 CASE('inca'); CALL msg(TRIM(msg1) // ' coupling with INCA chemistry model', modname) 187 CASE('inco'); CALL msg(TRIM(msg1) // ' coupling jointly with INCA and CO2 cycle', modname) 188 CASE('repr'); CALL msg(TRIM(msg1) // ' coupling with REPROBUS chemistry model', modname) 189 CASE('co2i'); CALL msg(TRIM(msg1) // ' you have chosen to run with CO2 cycle', modname) 190 CASE('coag'); CALL msg(TRIM(msg1) // ' tracers are treated for COAGULATION tests', modname) 191 CASE('lmdz'); CALL msg(TRIM(msg1) // ' tracers are treated in LMDZ only', modname) 192 CASE DEFAULT; CALL abort_gcm(modname, 'type_trac=' // TRIM(type_trac) // ' not possible yet.', 1) 193 END SELECT 194 195 !--- COHERENCE TEST BETWEEN "type_trac" AND PREPROCESSING KEYS 196 SELECT CASE(type_trac) 197 CASE('inca', 'inco') 198 198 IF (CPPKEY_INCA) THEN 199 199 CALL abort_gcm(modname, 'You must add cpp key INCA and compile with INCA code', 1) 200 200 END IF 201 201 CASE('repr') 202 202 #ifndef REPROBUS 203 203 CALL abort_gcm(modname, 'You must add cpp key REPROBUS and compile with REPROBUS code', 1) 204 204 #endif 205 206 #ifndef CPP_StratAer 207 208 #endif 209 END SELECT210 211 nqCO2 = COUNT( [type_trac == 'inco', type_trac == 'co2i'])212 213 !==============================================================================================================================214 ! 1) Get the numbers of: true (first order only) tracers "nqtrue", water tracers "nqo" (vapor/liquid/solid)215 !==============================================================================================================================216 texp = type_trac !=== EXPANDED VERSION OF "type_trac", WITH "|" SEPARATOR217 IF(texp == 'inco') texp = 'co2i|inca'218 IF(texp /= 'lmdz') texp = 'lmdz|'//TRIM(texp)219 220 !=== DETERMINE THE TYPE OF THE INPUT TRACERS DESCRIPTION FILE221 IF(testTracersFiles(modname, texp, fType, .TRUE.)) CALL abort_gcm(modname, 'problem with tracers file(s)',1)222 ttp = type_trac; IF(fType /= 1) ttp = texp223 224 IF(readTracersFiles(ttp, lRepr=type_trac=='repr')) CALL abort_gcm(modname, 'problem with tracers file(s)',1)225 !---------------------------------------------------------------------------------------------------------------------------226 IF(fType == 0) CALL abort_gcm(modname, 'Missing tracers file: "traceur.def", "tracer.def" or "tracer_<keyword>.def file.',1)227 !---------------------------------------------------------------------------------------------------------------------------228 IF(fType == 1 .AND. ANY(['inca','inco']==type_trac)) THEN !=== FOUND OLD STYLE INCA "traceur.def"229 !---------------------------------------------------------------------------------------------------------------------------230 IF (CPPKEY_INCA) THEN231 nqo = SIZE(tracers) - nqCO2232 CALL Init_chem_inca_trac(nqINCA) !--- Get nqINCA from INCA233 nbtr = nqINCA + nqCO2 !--- Number of tracers passed to phytrac234 nqtrue = nbtr + nqo !--- Total number of "true" tracers235 IF(ALL([2,3] /= nqo)) CALL abort_gcm(modname, 'Only 2 or 3 water phases allowed ; found nqo='//TRIM(int2str(nqo)), 1)236 ALLOCATE(hadv(nqtrue), hadv_inca(nqINCA), conv_flg_inca(nqINCA), solsym_inca(nqINCA))237 ALLOCATE(vadv(nqtrue), vadv_inca(nqINCA),pbl_flg_inca(nqINCA))238 CALL init_transport(solsym_inca, conv_flg_inca, pbl_flg_inca, hadv_inca, vadv_inca)239 ALLOCATE(ttr(nqtrue))240 ttr(1:nqo+nqCO2)= tracers241 ttr(1 : nqo)%component = 'lmdz'242 ttr(1+nqo:nqCO2+nqo)%component = 'co2i'243 ttr(1+nqo+nqCO2:nqtrue)%component = 'inca'244 ttr(1+nqo :nqtrue)%name = [('CO2 ', iq=1, nqCO2), solsym_inca]245 ttr(1+nqo+nqCO2:nqtrue)%parent= tran0246 ttr(1+nqo+nqCO2:nqtrue)%phase= 'g'247 lerr = getKey('hadv', had, ky=tracers(:)%keys)248 lerr = getKey('vadv', vad, ky=tracers(:)%keys)249 hadv(1:nqo+nqCO2) = had(:); hadv(1+nqo+nqCO2:nqtrue) = hadv_inca250 vadv(1:nqo+nqCO2) = vad(:); vadv(1+nqo+nqCO2:nqtrue) = vadv_inca251 CALL MOVE_ALLOC(FROM=ttr, TO=tracers)252 DO iq = 1, nqtrue253 t1 => tracers(iq)254 CALL addKey('name', t1%name,t1%keys)255 CALL addKey('component', t1%component, t1%keys)256 CALL addKey('parent', t1%parent,t1%keys)257 CALL addKey('phase', t1%phase,t1%keys)258 END DO259 IF(setGeneration(tracers)) CALL abort_gcm(modname,'See above',1) !- SET FIELDS %iGeneration, %gen0Name260 DEALLOCATE(had, hadv_inca, vad, vadv_inca, conv_flg_inca, pbl_flg_inca, solsym_inca)261 END IF262 !---------------------------------------------------------------------------------------------------------------------------263 ELSE !=== OTHER CASES (OLD OR NEW FORMAT, NO INCA MODULE)264 !---------------------------------------------------------------------------------------------------------------------------265 nqo =COUNT(delPhase(tracers(:)%name) == 'H2O' &266 205 CASE('coag') 206 IF (.NOT. CPPKEY_STRATAER) THEN 207 CALL abort_gcm(modname, 'You must add cpp key StratAer and compile with StratAer code', 1) 208 END IF 209 END SELECT 210 211 nqCO2 = COUNT([type_trac == 'inco', type_trac == 'co2i']) 212 213 !============================================================================================================================== 214 ! 1) Get the numbers of: true (first order only) tracers "nqtrue", water tracers "nqo" (vapor/liquid/solid) 215 !============================================================================================================================== 216 texp = type_trac !=== EXPANDED VERSION OF "type_trac", WITH "|" SEPARATOR 217 IF(texp == 'inco') texp = 'co2i|inca' 218 IF(texp /= 'lmdz') texp = 'lmdz|' // TRIM(texp) 219 220 !=== DETERMINE THE TYPE OF THE INPUT TRACERS DESCRIPTION FILE 221 IF(testTracersFiles(modname, texp, fType, .TRUE.)) CALL abort_gcm(modname, 'problem with tracers file(s)', 1) 222 ttp = type_trac; IF(fType /= 1) ttp = texp 223 224 IF(readTracersFiles(ttp, lRepr = type_trac=='repr')) CALL abort_gcm(modname, 'problem with tracers file(s)', 1) 225 !--------------------------------------------------------------------------------------------------------------------------- 226 IF(fType == 0) CALL abort_gcm(modname, 'Missing tracers file: "traceur.def", "tracer.def" or "tracer_<keyword>.def file.', 1) 227 !--------------------------------------------------------------------------------------------------------------------------- 228 IF(fType == 1 .AND. ANY(['inca', 'inco']==type_trac)) THEN !=== FOUND OLD STYLE INCA "traceur.def" 229 !--------------------------------------------------------------------------------------------------------------------------- 230 IF (CPPKEY_INCA) THEN 231 nqo = SIZE(tracers) - nqCO2 232 CALL Init_chem_inca_trac(nqINCA) !--- Get nqINCA from INCA 233 nbtr = nqINCA + nqCO2 !--- Number of tracers passed to phytrac 234 nqtrue = nbtr + nqo !--- Total number of "true" tracers 235 IF(ALL([2, 3] /= nqo)) CALL abort_gcm(modname, 'Only 2 or 3 water phases allowed ; found nqo=' // TRIM(int2str(nqo)), 1) 236 ALLOCATE(hadv(nqtrue), hadv_inca(nqINCA), conv_flg_inca(nqINCA), solsym_inca(nqINCA)) 237 ALLOCATE(vadv(nqtrue), vadv_inca(nqINCA), pbl_flg_inca(nqINCA)) 238 CALL init_transport(solsym_inca, conv_flg_inca, pbl_flg_inca, hadv_inca, vadv_inca) 239 ALLOCATE(ttr(nqtrue)) 240 ttr(1:nqo + nqCO2) = tracers 241 ttr(1:nqo)%component = 'lmdz' 242 ttr(1 + nqo:nqCO2 + nqo)%component = 'co2i' 243 ttr(1 + nqo + nqCO2:nqtrue)%component = 'inca' 244 ttr(1 + nqo:nqtrue)%name = [('CO2 ', iq = 1, nqCO2), solsym_inca] 245 ttr(1 + nqo + nqCO2:nqtrue)%parent = tran0 246 ttr(1 + nqo + nqCO2:nqtrue)%phase = 'g' 247 lerr = getKey('hadv', had, ky = tracers(:)%keys) 248 lerr = getKey('vadv', vad, ky = tracers(:)%keys) 249 hadv(1:nqo + nqCO2) = had(:); hadv(1 + nqo + nqCO2:nqtrue) = hadv_inca 250 vadv(1:nqo + nqCO2) = vad(:); vadv(1 + nqo + nqCO2:nqtrue) = vadv_inca 251 CALL MOVE_ALLOC(FROM = ttr, TO = tracers) 252 DO iq = 1, nqtrue 253 t1 => tracers(iq) 254 CALL addKey('name', t1%name, t1%keys) 255 CALL addKey('component', t1%component, t1%keys) 256 CALL addKey('parent', t1%parent, t1%keys) 257 CALL addKey('phase', t1%phase, t1%keys) 258 END DO 259 IF(setGeneration(tracers)) CALL abort_gcm(modname, 'See above', 1) !- SET FIELDS %iGeneration, %gen0Name 260 DEALLOCATE(had, hadv_inca, vad, vadv_inca, conv_flg_inca, pbl_flg_inca, solsym_inca) 261 END IF 262 !--------------------------------------------------------------------------------------------------------------------------- 263 ELSE !=== OTHER CASES (OLD OR NEW FORMAT, NO INCA MODULE) 264 !--------------------------------------------------------------------------------------------------------------------------- 265 nqo = COUNT(delPhase(tracers(:)%name) == 'H2O' & 266 .AND. tracers(:)%component == 'lmdz') !--- Number of water phases 267 267 nqtrue = SIZE(tracers) !--- Total number of "true" tracers 268 nbtr = nqtrue-COUNT(delPhase(tracers(:)%gen0Name) == 'H2O' &269 270 IF (CPPKEY_INCA) THEN271 nqINCA = COUNT(tracers(:)%component == 'inca')272 END IF273 lerr = getKey('hadv', hadv, ky =tracers(:)%keys)274 lerr = getKey('vadv', vadv, ky =tracers(:)%keys)275 !---------------------------------------------------------------------------------------------------------------------------276 END IF277 !---------------------------------------------------------------------------------------------------------------------------268 nbtr = nqtrue - COUNT(delPhase(tracers(:)%gen0Name) == 'H2O' & 269 .AND. tracers(:)%component == 'lmdz') !--- Number of tracers passed to phytrac 270 IF (CPPKEY_INCA) THEN 271 nqINCA = COUNT(tracers(:)%component == 'inca') 272 END IF 273 lerr = getKey('hadv', hadv, ky = tracers(:)%keys) 274 lerr = getKey('vadv', vadv, ky = tracers(:)%keys) 275 !--------------------------------------------------------------------------------------------------------------------------- 276 END IF 277 !--------------------------------------------------------------------------------------------------------------------------- 278 278 279 279 #ifdef REPROBUS … … 282 282 283 283 #endif 284 !==============================================================================================================================285 ! 2) Calculate nqtot, number of tracers needed (greater if advection schemes 20 or 30 have been chosen).286 !==============================================================================================================================287 DO iq = 1, nqtrue288 IF( hadv(iq)<20 .OR. (ANY(hadv(iq)==[20,30]) .AND. hadv(iq)==vadv(iq))) CYCLE289 WRITE(msg1, '("The choice hadv=",i0,", vadv=",i0,a)')hadv(iq),vadv(iq),' for "'//TRIM(tracers(iq)%name)//'" is not available'284 !============================================================================================================================== 285 ! 2) Calculate nqtot, number of tracers needed (greater if advection schemes 20 or 30 have been chosen). 286 !============================================================================================================================== 287 DO iq = 1, nqtrue 288 IF(hadv(iq)<20 .OR. (ANY(hadv(iq)==[20, 30]) .AND. hadv(iq)==vadv(iq))) CYCLE 289 WRITE(msg1, '("The choice hadv=",i0,", vadv=",i0,a)')hadv(iq), vadv(iq), ' for "' // TRIM(tracers(iq)%name) // '" is not available' 290 290 CALL abort_gcm(modname, TRIM(msg1), 1) 291 END DO292 nqtot = COUNT( hadv< 20 .AND. vadv< 20) & !--- No additional tracer293 + 4*COUNT( hadv==20 .AND. vadv==20) & !--- 3 additional tracers294 + 10*COUNT( hadv==30 .AND. vadv==30) !--- 9 additional tracers295 296 !--- More tracers due to the choice of advection scheme => assign total number of tracers297 IF( nqtot /= nqtrue) THEN291 END DO 292 nqtot = COUNT(hadv< 20 .AND. vadv< 20) & !--- No additional tracer 293 + 4 * COUNT(hadv==20 .AND. vadv==20) & !--- 3 additional tracers 294 + 10 * COUNT(hadv==30 .AND. vadv==30) !--- 9 additional tracers 295 296 !--- More tracers due to the choice of advection scheme => assign total number of tracers 297 IF(nqtot /= nqtrue) THEN 298 298 CALL msg('The choice of advection scheme for one or more tracers makes it necessary to add tracers') 299 CALL msg('The number of true tracers is ' //TRIM(int2str(nqtrue)))300 CALL msg('The total number of tracers needed is ' //TRIM(int2str(nqtot)))301 END IF302 303 !==============================================================================================================================304 ! 3) Determine the advection scheme choice for water and tracers "iadv" and the fields long name, isAdvected.305 ! iadv = 1 "LMDZ-specific humidity transport" (for H2O vapour) LMV306 ! iadv = 2 backward (for H2O liquid) BAK307 ! iadv = 14 Van-Leer + specific humidity, modified by Francis Codron VLH308 ! iadv = 10 Van-Leer (chosen for vapour and liquid water) VL1309 ! iadv = 11 Van-Leer for hadv and PPM version (Monotonic) for vadv VLP310 ! iadv = 12 Frederic Hourdin I FH1311 ! iadv = 13 Frederic Hourdin II FH2312 ! iadv = 16 Monotonic PPM (Collela & Woodward 1984) PPM313 ! iadv = 17 Semi-monotonic PPM (overshoots allowed) PPS314 ! iadv = 18 Definite positive PPM (overshoots and undershoots allowed) PPP315 ! iadv = 20 Slopes SLP316 ! iadv = 30 Prather PRA317 !318 ! In array q(ij,l,iq) : iq = 1/2[/3] for vapour/liquid[/ice] water319 ! And optionaly: iq = 3[4],nqtot for other tracers320 !==============================================================================================================================321 ALLOCATE(ttr(nqtot))322 jq = nqtrue+1; tracers(:)%iadv = -1323 DO iq = 1, nqtrue299 CALL msg('The number of true tracers is ' // TRIM(int2str(nqtrue))) 300 CALL msg('The total number of tracers needed is ' // TRIM(int2str(nqtot))) 301 END IF 302 303 !============================================================================================================================== 304 ! 3) Determine the advection scheme choice for water and tracers "iadv" and the fields long name, isAdvected. 305 ! iadv = 1 "LMDZ-specific humidity transport" (for H2O vapour) LMV 306 ! iadv = 2 backward (for H2O liquid) BAK 307 ! iadv = 14 Van-Leer + specific humidity, modified by Francis Codron VLH 308 ! iadv = 10 Van-Leer (chosen for vapour and liquid water) VL1 309 ! iadv = 11 Van-Leer for hadv and PPM version (Monotonic) for vadv VLP 310 ! iadv = 12 Frederic Hourdin I FH1 311 ! iadv = 13 Frederic Hourdin II FH2 312 ! iadv = 16 Monotonic PPM (Collela & Woodward 1984) PPM 313 ! iadv = 17 Semi-monotonic PPM (overshoots allowed) PPS 314 ! iadv = 18 Definite positive PPM (overshoots and undershoots allowed) PPP 315 ! iadv = 20 Slopes SLP 316 ! iadv = 30 Prather PRA 317 ! 318 ! In array q(ij,l,iq) : iq = 1/2[/3] for vapour/liquid[/ice] water 319 ! And optionaly: iq = 3[4],nqtot for other tracers 320 !============================================================================================================================== 321 ALLOCATE(ttr(nqtot)) 322 jq = nqtrue + 1; tracers(:)%iadv = -1 323 DO iq = 1, nqtrue 324 324 t1 => tracers(iq) 325 325 326 326 !--- VERIFY THE CHOICE OF ADVECTION SCHEME 327 327 iad = -1 328 IF(hadv(iq) == vadv(iq) 328 IF(hadv(iq) == vadv(iq)) iad = hadv(iq) 329 329 IF(hadv(iq)==10 .AND. vadv(iq)==16) iad = 11 330 WRITE(msg1, '("Bad choice of advection scheme for ",a,": hadv = ",i0,", vadv = ",i0)')TRIM(t1%name), hadv(iq), vadv(iq)330 WRITE(msg1, '("Bad choice of advection scheme for ",a,": hadv = ",i0,", vadv = ",i0)')TRIM(t1%name), hadv(iq), vadv(iq) 331 331 IF(iad == -1) CALL abort_gcm(modname, msg1, 1) 332 332 333 333 !--- SET FIELDS %longName, %iadv, %isAdvected, %isInPhysics 334 t1%longName = t1%name; IF(iad > 0) t1%longName=TRIM(t1%name)//descrq(iad)335 t1%iadv 334 t1%longName = t1%name; IF(iad > 0) t1%longName = TRIM(t1%name) // descrq(iad) 335 t1%iadv = iad 336 336 t1%isAdvected = iad >= 0 337 t1%isInPhysics = delPhase(t1%gen0Name) /= 'H2O' &338 339 ttr(iq) 337 t1%isInPhysics = delPhase(t1%gen0Name) /= 'H2O' & 338 .OR. t1%component /= 'lmdz' !=== OTHER EXCEPTIONS TO BE ADDED: CO2i, SURSATURATED WATER CLOUD... 339 ttr(iq) = t1 340 340 341 341 !--- DEFINE THE HIGHER ORDER TRACERS, IF ANY … … 344 344 IF(iad == 30) nm = 9 !--- 3rd order scheme 345 345 IF(nm == 0) CYCLE !--- No higher moments 346 ttr(jq +1:jq+nm)= t1347 ttr(jq +1:jq+nm)%name = [ (TRIM(t1%name) //'-'//TRIM(suff(im)), im=1, nm) ]348 ttr(jq +1:jq+nm)%parent = [ (TRIM(t1%parent) //'-'//TRIM(suff(im)), im=1, nm) ]349 ttr(jq +1:jq+nm)%longName = [ (TRIM(t1%longName)//'-'//TRIM(suff(im)), im=1, nm) ]350 ttr(jq +1:jq+nm)%iadv = [ (-iad, im=1, nm) ]351 ttr(jq +1:jq+nm)%isAdvected = [ (.FALSE., im=1, nm) ]346 ttr(jq + 1:jq + nm) = t1 347 ttr(jq + 1:jq + nm)%name = [ (TRIM(t1%name) // '-' // TRIM(suff(im)), im = 1, nm) ] 348 ttr(jq + 1:jq + nm)%parent = [ (TRIM(t1%parent) // '-' // TRIM(suff(im)), im = 1, nm) ] 349 ttr(jq + 1:jq + nm)%longName = [ (TRIM(t1%longName) // '-' // TRIM(suff(im)), im = 1, nm) ] 350 ttr(jq + 1:jq + nm)%iadv = [ (-iad, im = 1, nm) ] 351 ttr(jq + 1:jq + nm)%isAdvected = [ (.FALSE., im = 1, nm) ] 352 352 jq = jq + nm 353 END DO354 DEALLOCATE(hadv, vadv)355 CALL MOVE_ALLOC(FROM=ttr, TO=tracers)356 357 !--- SET FIELDS %iqParent, %nqChildren, %iGeneration, %iqDescen, %nqDescen358 IF(indexUpdate(tracers)) CALL abort_gcm(modname, 'problem with tracers indices update', 1)359 360 !=== TEST ADVECTION SCHEME361 DO iq=1,nqtot ; t1 => tracers(iq); iad = t1%iadv362 363 364 IF(ALL([10,14,0] /= iad)) &365 CALL abort_gcm(modname, 'Not tested for iadv='//TRIM(int2str(iad))//' ; 10 or 14 only are allowed !', 1)366 367 368 IF(ALL([10,14] /= iad) .AND. t1%iGeneration == 1 .AND. ANY(tracers(:)%iGeneration > 1)) &369 CALL abort_gcm(modname, 'iadv='//TRIM(int2str(iad))//' not implemented for parents ; 10 or 14 only are allowed !', 1)370 371 372 IF(fmsg('WARNING ! iadv='//TRIM(int2str(iad))//' not implemented for childs. Setting iadv=10 for "'//TRIM(t1%name)//'"',&373 modname, iad /= 10 .AND. t1%iGeneration > 1)) t1%iadv = 10374 375 376 ll = t1%name /= addPhase('H2O','g')377 IF(fmsg('WARNING ! iadv=14 is valid for water vapour only. Setting iadv=10 for "'//TRIM(t1%name)//'".', &378 modname, iad == 14 .AND. ll)) t1%iadv = 10379 END DO380 381 !=== READ PHYSICAL PARAMETERS FOR ISOTOPES ; DONE HERE BECAUSE dynetat0 AND iniacademic NEED "tnat" AND "alpha_ideal"382 niso = 0; nzone = 0; nphas = nqo; ntiso = 0; isoCheck = .FALSE.383 IF(processIsotopes()) CALL abort_gcm(modname, 'problem when processing isotopes parameters', 1)384 385 !--- Convection / boundary layer activation for all tracers386 ALLOCATE(conv_flg(nbtr)); conv_flg(1:nbtr) = 1387 ALLOCATE(pbl_flg(nbtr)); pbl_flg(1:nbtr) = 1388 389 !--- Note: nqtottr can differ from nbtr when nmom/=0390 nqtottr = nqtot - COUNT(delPhase(tracers%gen0Name) == 'H2O' .AND. tracers%component == 'lmdz')391 IF(COUNT(tracers%iso_iName == 0) - COUNT(delPhase(tracers%name) == 'H2O' .AND. tracers%component == 'lmdz') /= nqtottr) &392 CALL abort_gcm(modname, 'problem with the computation of nqtottr', 1)393 394 !=== DISPLAY THE RESULTS395 CALL msg('nqo = '//TRIM(int2str(nqo)),modname)396 CALL msg('nbtr = '//TRIM(int2str(nbtr)),modname)397 CALL msg('nqtrue = '//TRIM(int2str(nqtrue)), modname)398 CALL msg('nqtot = '//TRIM(int2str(nqtot)),modname)399 CALL msg('niso = '//TRIM(int2str(niso)),modname)400 CALL msg('ntiso = '//TRIM(int2str(ntiso)),modname)401 IF (CPPKEY_INCA) THEN402 CALL msg('nqCO2 = ' //TRIM(int2str(nqCO2)),modname)403 CALL msg('nqINCA = ' //TRIM(int2str(nqINCA)), modname)404 END IF405 t => tracers406 CALL msg('Information stored in infotrac :', modname)407 408 IF(dispTable('isssssssssiiiiiiiii', ['iq ', 'name', 'lNam', 'g0Nm', 'prnt', 'type', 'phas', 'comp',&409 'isPh', 'isAd', 'iadv', 'iGen', 'iqPr', 'nqDe', 'nqCh', 'iGrp', 'iNam', 'iZon', 'iPha'],&410 cat(t%name, t%longName, t%gen0Name, t%parent, t%type, t%phase, t%component, bool2str(t%isInPhysics), &411 412 cat([(iq, iq=1, nqtot)], t%iadv, t%iGeneration, t%iqParent, t%nqDescen, t%nqChildren, t%iso_iGroup,&413 t%iso_iName, t%iso_iZone, t%iso_iPhase), nColMax=maxTableWidth, nHead=2, sub=modname)) &414 CALL abort_gcm(modname, "problem with the tracers table content", 1)415 IF(niso > 0) THEN416 CALL msg('Where, for isotopes family "' //TRIM(isotope%parent)//'":', modname)417 CALL msg(' isoKeys%name = ' //strStack(isoKeys%name), modname)418 CALL msg(' isoName = ' //strStack(isoName),modname)419 CALL msg(' isoZone = ' //strStack(isoZone),modname)420 CALL msg(' isoPhas = ' //TRIM(isoPhas),modname)421 ELSE353 END DO 354 DEALLOCATE(hadv, vadv) 355 CALL MOVE_ALLOC(FROM = ttr, TO = tracers) 356 357 !--- SET FIELDS %iqParent, %nqChildren, %iGeneration, %iqDescen, %nqDescen 358 IF(indexUpdate(tracers)) CALL abort_gcm(modname, 'problem with tracers indices update', 1) 359 360 !=== TEST ADVECTION SCHEME 361 DO iq = 1, nqtot ; t1 => tracers(iq); iad = t1%iadv 362 363 !--- ONLY TESTED VALUES FOR TRACERS FOR NOW: iadv = 14, 10 (and 0 for non-transported tracers) 364 IF(ALL([10, 14, 0] /= iad)) & 365 CALL abort_gcm(modname, 'Not tested for iadv=' // TRIM(int2str(iad)) // ' ; 10 or 14 only are allowed !', 1) 366 367 !--- ONLY TESTED VALUES FOR PARENTS HAVING CHILDS FOR NOW: iadv = 14, 10 (PARENTS: TRACERS OF GENERATION 1) 368 IF(ALL([10, 14] /= iad) .AND. t1%iGeneration == 1 .AND. ANY(tracers(:)%iGeneration > 1)) & 369 CALL abort_gcm(modname, 'iadv=' // TRIM(int2str(iad)) // ' not implemented for parents ; 10 or 14 only are allowed !', 1) 370 371 !--- ONLY TESTED VALUES FOR CHILDS FOR NOW: iadv = 10 (CHILDS: TRACERS OF GENERATION GREATER THAN 1) 372 IF(fmsg('WARNING ! iadv=' // TRIM(int2str(iad)) // ' not implemented for childs. Setting iadv=10 for "' // TRIM(t1%name) // '"', & 373 modname, iad /= 10 .AND. t1%iGeneration > 1)) t1%iadv = 10 374 375 !--- ONLY VALID SCHEME NUMBER FOR WATER VAPOUR: iadv = 14 376 ll = t1%name /= addPhase('H2O', 'g') 377 IF(fmsg('WARNING ! iadv=14 is valid for water vapour only. Setting iadv=10 for "' // TRIM(t1%name) // '".', & 378 modname, iad == 14 .AND. ll)) t1%iadv = 10 379 END DO 380 381 !=== READ PHYSICAL PARAMETERS FOR ISOTOPES ; DONE HERE BECAUSE dynetat0 AND iniacademic NEED "tnat" AND "alpha_ideal" 382 niso = 0; nzone = 0; nphas = nqo; ntiso = 0; isoCheck = .FALSE. 383 IF(processIsotopes()) CALL abort_gcm(modname, 'problem when processing isotopes parameters', 1) 384 385 !--- Convection / boundary layer activation for all tracers 386 ALLOCATE(conv_flg(nbtr)); conv_flg(1:nbtr) = 1 387 ALLOCATE(pbl_flg(nbtr)); pbl_flg(1:nbtr) = 1 388 389 !--- Note: nqtottr can differ from nbtr when nmom/=0 390 nqtottr = nqtot - COUNT(delPhase(tracers%gen0Name) == 'H2O' .AND. tracers%component == 'lmdz') 391 IF(COUNT(tracers%iso_iName == 0) - COUNT(delPhase(tracers%name) == 'H2O' .AND. tracers%component == 'lmdz') /= nqtottr) & 392 CALL abort_gcm(modname, 'problem with the computation of nqtottr', 1) 393 394 !=== DISPLAY THE RESULTS 395 CALL msg('nqo = ' // TRIM(int2str(nqo)), modname) 396 CALL msg('nbtr = ' // TRIM(int2str(nbtr)), modname) 397 CALL msg('nqtrue = ' // TRIM(int2str(nqtrue)), modname) 398 CALL msg('nqtot = ' // TRIM(int2str(nqtot)), modname) 399 CALL msg('niso = ' // TRIM(int2str(niso)), modname) 400 CALL msg('ntiso = ' // TRIM(int2str(ntiso)), modname) 401 IF (CPPKEY_INCA) THEN 402 CALL msg('nqCO2 = ' // TRIM(int2str(nqCO2)), modname) 403 CALL msg('nqINCA = ' // TRIM(int2str(nqINCA)), modname) 404 END IF 405 t => tracers 406 CALL msg('Information stored in infotrac :', modname) 407 408 IF(dispTable('isssssssssiiiiiiiii', ['iq ', 'name', 'lNam', 'g0Nm', 'prnt', 'type', 'phas', 'comp', & 409 'isPh', 'isAd', 'iadv', 'iGen', 'iqPr', 'nqDe', 'nqCh', 'iGrp', 'iNam', 'iZon', 'iPha'], & 410 cat(t%name, t%longName, t%gen0Name, t%parent, t%type, t%phase, t%component, bool2str(t%isInPhysics), & 411 bool2str(t%isAdvected)), & 412 cat([(iq, iq = 1, nqtot)], t%iadv, t%iGeneration, t%iqParent, t%nqDescen, t%nqChildren, t%iso_iGroup, & 413 t%iso_iName, t%iso_iZone, t%iso_iPhase), nColMax = maxTableWidth, nHead = 2, sub = modname)) & 414 CALL abort_gcm(modname, "problem with the tracers table content", 1) 415 IF(niso > 0) THEN 416 CALL msg('Where, for isotopes family "' // TRIM(isotope%parent) // '":', modname) 417 CALL msg(' isoKeys%name = ' // strStack(isoKeys%name), modname) 418 CALL msg(' isoName = ' // strStack(isoName), modname) 419 CALL msg(' isoZone = ' // strStack(isoZone), modname) 420 CALL msg(' isoPhas = ' // TRIM(isoPhas), modname) 421 ELSE 422 422 CALL msg('No isotopes identified.', modname) 423 END IF424 CALL msg('end', modname)425 426 END SUBROUTINE init_infotrac423 END IF 424 CALL msg('end', modname) 425 426 END SUBROUTINE init_infotrac 427 427 428 428 END MODULE infotrac
Note: See TracChangeset
for help on using the changeset viewer.