[834] | 1 | MODULE earth_const |
---|
| 2 | USE prec, ONLY : rstd |
---|
| 3 | IMPLICIT NONE |
---|
| 4 | SAVE |
---|
| 5 | |
---|
| 6 | ! init_earth_const is called from icosa_init outside of an OMP PARALLEL section |
---|
| 7 | ! hence the variables set here are not THREADPRIVATE |
---|
| 8 | |
---|
[836] | 9 | ! Some variable are BIND(C) to be accessible from Python |
---|
| 10 | |
---|
| 11 | REAL(rstd), BIND(C) :: g=9.80616 ! acceleration of gravity assumed constant |
---|
| 12 | REAL(rstd):: radius=6.37122E6 |
---|
[834] | 13 | REAL(rstd) :: omega=7.292E-5 |
---|
| 14 | REAL(rstd) :: scale_factor=1. |
---|
| 15 | REAL(rstd),PARAMETER :: daysec=86400 |
---|
| 16 | |
---|
[836] | 17 | REAL(rstd), BIND(C) :: Treff=273., & ! reference temperature, used in definition of entropy |
---|
| 18 | preff=101325., & ! reference pressure, used in definition of entropy and theta |
---|
| 19 | cpp=1004.70885, & ! specific heat at constant pressure at t=Treff for dry air |
---|
| 20 | cppv=1860., & ! specific heat at constant pressure at t=Treff for water vapor |
---|
| 21 | Rd, & ! specific perfect gas constant for dry air |
---|
| 22 | Rv=461.5 ! specific perfect gas constant for water vapor |
---|
| 23 | |
---|
| 24 | REAL(rstd) :: nu=0.35 ! exponent in variable-Cp law Cp=cpp*(T/Treff)^nu |
---|
| 25 | REAL(rstd) :: pa=50000. ! default value set to preff/2 by disvert_std |
---|
[834] | 26 | REAL(rstd) :: scale_height=8000. ! atmospheric scale height (m) |
---|
| 27 | REAL(rstd) :: gas_constant = 8.3144621 |
---|
[836] | 28 | REAL(rstd) :: mu ! molar mass (?) |
---|
[834] | 29 | |
---|
[836] | 30 | REAL(rstd) :: kappa=0.2857143 |
---|
| 31 | |
---|
| 32 | INTEGER, PARAMETER :: thermo_none=-99, thermo_theta=1, thermo_entropy=2, thermo_variable_Cp=3, & |
---|
[834] | 33 | thermo_moist=4, thermo_boussinesq=5, thermo_dry=10, thermo_fake_moist=11, thermo_moist_debug=100 |
---|
[836] | 34 | LOGICAL :: boussinesq |
---|
| 35 | INTEGER, BIND(C) :: caldyn_thermo, physics_thermo |
---|
[834] | 36 | |
---|
| 37 | CONTAINS |
---|
| 38 | |
---|
| 39 | SUBROUTINE init_earth_const |
---|
| 40 | USE getin_mod, ONLY : getin |
---|
| 41 | USE grid_param, ONLY : nqdyn |
---|
| 42 | USE omp_para, ONLY : is_master |
---|
| 43 | USE mpipara, ONLY : is_mpi_root |
---|
| 44 | CHARACTER(len=255) :: def |
---|
| 45 | |
---|
| 46 | CALL getin("g",g) |
---|
| 47 | CALL getin("radius",radius) |
---|
| 48 | CALL getin("omega",omega) |
---|
| 49 | CALL getin("scale_factor",scale_factor) |
---|
| 50 | radius=radius/scale_factor |
---|
| 51 | omega=omega*scale_factor |
---|
| 52 | |
---|
| 53 | CALL getin("kappa",kappa) |
---|
| 54 | CALL getin("cpp",cpp) |
---|
| 55 | CALL getin("cppv",cppv) |
---|
| 56 | CALL getin("Rv",Rv) |
---|
| 57 | CALL getin("preff",preff) |
---|
| 58 | CALL getin("Treff",Treff) |
---|
| 59 | CALL getin("scale_height",scale_height) |
---|
| 60 | Rd = kappa*cpp ! kappa = Rd/Cp |
---|
| 61 | mu = kappa/cpp ! FIXME ?? |
---|
| 62 | |
---|
| 63 | nqdyn=1 |
---|
| 64 | physics_thermo = thermo_none |
---|
| 65 | |
---|
| 66 | def='theta' |
---|
| 67 | CALL getin('thermo',def) |
---|
| 68 | SELECT CASE(TRIM(def)) |
---|
| 69 | CASE('boussinesq') |
---|
| 70 | boussinesq=.TRUE. |
---|
| 71 | caldyn_thermo=thermo_boussinesq |
---|
| 72 | CASE('theta') |
---|
| 73 | caldyn_thermo=thermo_theta |
---|
| 74 | physics_thermo=thermo_dry |
---|
| 75 | CASE('entropy') |
---|
| 76 | caldyn_thermo=thermo_entropy |
---|
| 77 | physics_thermo=thermo_dry |
---|
| 78 | CASE('variable_Cp') |
---|
| 79 | caldyn_thermo=thermo_variable_Cp |
---|
| 80 | physics_thermo=thermo_variable_Cp |
---|
| 81 | CALL getin("nu",nu) |
---|
| 82 | CASE('theta_fake_moist') |
---|
| 83 | caldyn_thermo=thermo_theta |
---|
| 84 | physics_thermo=thermo_fake_moist |
---|
| 85 | CASE('entropy_fake_moist') |
---|
| 86 | caldyn_thermo=thermo_entropy |
---|
| 87 | physics_thermo=thermo_fake_moist |
---|
| 88 | CASE('moist') |
---|
| 89 | caldyn_thermo=thermo_moist_debug |
---|
| 90 | physics_thermo=thermo_moist |
---|
| 91 | nqdyn = 2 |
---|
| 92 | CASE DEFAULT |
---|
| 93 | IF (is_mpi_root) PRINT *,'Bad selector for variable caldyn_thermo : <', & |
---|
| 94 | TRIM(def),'> options are <theta>, <entropy>' |
---|
| 95 | STOP |
---|
| 96 | END SELECT |
---|
| 97 | |
---|
| 98 | IF(is_master) THEN |
---|
| 99 | SELECT CASE(caldyn_thermo) |
---|
| 100 | CASE(thermo_theta) |
---|
| 101 | PRINT *, 'caldyn_thermo = thermo_theta' |
---|
| 102 | CASE(thermo_entropy) |
---|
| 103 | PRINT *, 'caldyn_thermo = thermo_entropy' |
---|
| 104 | CASE(thermo_moist_debug) |
---|
| 105 | PRINT *, 'caldyn_thermo = thermo_moist_debug' |
---|
| 106 | CASE DEFAULT |
---|
| 107 | STOP |
---|
| 108 | END SELECT |
---|
| 109 | |
---|
| 110 | SELECT CASE(physics_thermo) |
---|
| 111 | CASE(thermo_dry) |
---|
| 112 | PRINT *, 'physics_thermo = thermo_dry' |
---|
| 113 | CASE(thermo_fake_moist) |
---|
| 114 | PRINT *, 'physics_thermo = thermo_fake_moist' |
---|
| 115 | CASE(thermo_moist) |
---|
| 116 | PRINT *, 'physics_thermo = thermo_moist' |
---|
| 117 | END SELECT |
---|
| 118 | |
---|
| 119 | END IF |
---|
| 120 | |
---|
| 121 | END SUBROUTINE init_earth_const |
---|
| 122 | |
---|
| 123 | END MODULE earth_const |
---|