Skip to content
Merged
Show file tree
Hide file tree
Changes from 56 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
0a1ec4a
Merge remote-tracking branch 'origin/dsl/develop' into dsl/extradim_f…
CharlesKrop Oct 11, 2024
9490578
Merge remote-tracking branch 'origin/dsl/develop' into dsl/extradim_f…
CharlesKrop Oct 15, 2024
c78e946
Merge remote-tracking branch 'origin/dsl/develop' into dsl/GFDL_1M_dr…
CharlesKrop Nov 7, 2024
93c53a2
Written and verified: fall_speed, terminal_fall, implicit_fall, wqs2
CharlesKrop Nov 29, 2024
8f10431
icloud verifies through line 474 of icloud_component_2 (end of major …
CharlesKrop Dec 9, 2024
99ba9a5
Assembled, functioning GFDL_1M_driver. Errors remain: DQADTmic, DUDTm…
CharlesKrop Dec 22, 2024
63b9d46
Updates to the driver
CharlesKrop Dec 26, 2024
14c08d6
Added flexible backend specifier for driver_tables and improved the c…
CharlesKrop Dec 26, 2024
434b244
Clean up
CharlesKrop Dec 30, 2024
425dc6c
Merge remote-tracking branch 'origin/dsl/develop' into dsl/GFDL_1M_dr…
CharlesKrop Dec 30, 2024
15dc561
pre-commit run and corrected errors
CharlesKrop Dec 30, 2024
5875e82
Add `pymoist_GFDL_1M_driver` hook and interface for microphysics driv…
FlorianDeconinck Dec 30, 2024
2151fbb
docstrings
CharlesKrop Dec 31, 2024
94a9f46
Merge branch 'dsl/GFDL_1M_driver' of github.com:CharlesKrop/GEOSgcm_G…
CharlesKrop Dec 31, 2024
7685b6b
refactored GFDL_1M_driver __init__ to move calculation of constants t…
CharlesKrop Dec 31, 2024
a83b6d3
capitalized constants
CharlesKrop Dec 31, 2024
05bdd2b
update to python bridge to work with GFDL driver
CharlesKrop Jan 8, 2025
721e0c0
Refactored bridge, created independent call & function cascade for gf…
CharlesKrop Jan 8, 2025
df5e551
Reworked gfdl driver calls into the pymoist wrapper
CharlesKrop Jan 8, 2025
d2a00b7
Working interface to pyMoist.GDFL_1M_driver
FlorianDeconinck Jan 8, 2025
daa9f10
Reset precipitation temporaries between iterations and functions
CharlesKrop Jan 10, 2025
91f27f0
Merge branch 'dsl/GFDL_1M_driver' of github.com:CharlesKrop/GEOSgcm_G…
CharlesKrop Jan 10, 2025
a8ba509
Reset a few more outputs that were missed on the previous pass
CharlesKrop Jan 10, 2025
aa7b073
Re-enabled precipitation conversion to mm/day
CharlesKrop Jan 10, 2025
0703593
Remove debug - HPC ready
FlorianDeconinck Jan 10, 2025
4c582a5
Added check for fix_negative in check_flags
CharlesKrop Jan 10, 2025
8ba44ff
Merge branch 'dsl/GFDL_1M_driver' of github.com:CharlesKrop/GEOSgcm_G…
CharlesKrop Jan 10, 2025
9d0b1a7
removing dead code from warm_rain.py
CharlesKrop Jan 15, 2025
352f7b6
Merge branch 'dsl/GFDL_1M_driver' into dsl/GFDL_1M
CharlesKrop Jan 28, 2025
ffb93ec
Major reorganization. No numerical differences. Results are still wro…
CharlesKrop Feb 18, 2025
54c8fd6
Merge branch 'dsl/GFDL_1M' into dsl/GFDL_1M_driver
CharlesKrop Feb 18, 2025
43ac84b
Revert run_tests.sh
CharlesKrop Feb 18, 2025
5ea9313
reverted qsat.py
CharlesKrop Feb 18, 2025
b6ff723
Linting
CharlesKrop Feb 18, 2025
f7d6203
OSX DS_Store removal
FlorianDeconinck Feb 19, 2025
bfdfed3
Cleanup per Florian's PR comments
CharlesKrop Feb 19, 2025
fe72620
few new sat table constants, changed a few old constants to ensure th…
CharlesKrop Feb 20, 2025
6da508e
Renames files, moved icloud and warm_rain into their own classes
CharlesKrop Feb 20, 2025
355d2ca
finish refactor of driver class. last couple subclasses created. no n…
CharlesKrop Feb 20, 2025
d2b9722
Merge branch 'dsl/GFDL_1M_driver' of github.com:CharlesKrop/GEOSgcm_G…
CharlesKrop Feb 20, 2025
2dc822e
Major reorganization of warm_rain. Minor reorganization/renaming in t…
CharlesKrop Feb 24, 2025
1595619
new translate test design, implemented on warm_rain, first attempt. c…
CharlesKrop Feb 25, 2025
69f7768
New translate tests. All are funcitonal EXCEPT the main driver test. …
CharlesKrop Feb 25, 2025
18a7098
Update GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMo…
CharlesKrop Feb 27, 2025
136d102
changed i32 to int
CharlesKrop Feb 27, 2025
2fe3bcd
Update GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMo…
CharlesKrop Feb 27, 2025
9a0deb4
added docstrings for constants
CharlesKrop Feb 27, 2025
38318db
bunch of updates per Tobias' review
CharlesKrop Feb 27, 2025
cdb315f
more changes from tobias' review
CharlesKrop Feb 28, 2025
922b41c
Merge branch 'dsl/GFDL_1M_driver' of github.com:CharlesKrop/GEOSgcm_G…
CharlesKrop Feb 28, 2025
6eafc57
changed organization of constant files
CharlesKrop Mar 3, 2025
9daa8d6
stencilified the saturation table calculations
CharlesKrop Mar 4, 2025
207ccdf
last round of changes per Tobias' first round of comments
CharlesKrop Mar 4, 2025
0cec3e1
pre-commit checks
CharlesKrop Mar 4, 2025
3b69483
classes to dataclasses where appropriate
CharlesKrop Mar 5, 2025
e88411e
linting
CharlesKrop Mar 6, 2025
b4a4e94
autodetection of library_dirs for the pymoist interface
CharlesKrop Mar 7, 2025
3d2b8a6
pre-commit
CharlesKrop Mar 7, 2025
86412cd
MicrophysicsConfiguration class --> dataclass
CharlesKrop Mar 7, 2025
971a307
Remove unneeded `make`
FlorianDeconinck Mar 7, 2025
1ab3622
Lint
FlorianDeconinck Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ module GEOS_GFDL_1M_InterfaceMod
use gfdl2_cloud_microphys_mod
#ifdef PYMOIST_INTEGRATION
use pymoist_interface_mod
use ieee_exceptions, only: ieee_get_halting_mode, ieee_set_halting_mode, ieee_all
#endif

implicit none
Expand Down Expand Up @@ -62,8 +63,9 @@ module GEOS_GFDL_1M_InterfaceMod
logical :: LPHYS_HYDROSTATIC
logical :: LMELTFRZ
#ifdef PYMOIST_INTEGRATION
integer :: C_LMELTFRZ
logical :: USE_PYMOIST_GFDL1M = .FALSE. ! Replace Aer Activation with pyMoist port
integer :: C_LMELTFRZ, C_LHYDROSTATIC, C_LPHYS_HYDROSTATIC
logical :: USE_PYMOIST_GFDL1M_EVAP = .FALSE. ! Replace EVAP with pyMoist port
logical :: USE_PYMOIST_GFDL1M_DRIVER = .FALSE. ! Replace Aer Activation with pyMoist port
#endif

public :: GFDL_1M_Setup, GFDL_1M_Initialize, GFDL_1M_Run
Expand Down Expand Up @@ -296,7 +298,8 @@ subroutine GFDL_1M_Initialize (MAPL, RC)
call MAPL_GetResource( MAPL, CNV_FRACTION_MAX, 'CNV_FRACTION_MAX:', DEFAULT= 1500.0, RC=STATUS); VERIFY_(STATUS)
call MAPL_GetResource( MAPL, CNV_FRACTION_EXP, 'CNV_FRACTION_EXP:', DEFAULT= 1.0, RC=STATUS); VERIFY_(STATUS)
#ifdef PYMOIST_INTEGRATION
call MAPL_GetResource(MAPL, USE_PYMOIST_GFDL1M, 'USE_PYMOIST_GFDL1M:', default=.FALSE., RC=STATUS); VERIFY_(STATUS);
call MAPL_GetResource(MAPL, USE_PYMOIST_GFDL1M_EVAP, 'USE_PYMOIST_GFDL1M_EVAP:', default=.FALSE., RC=STATUS); VERIFY_(STATUS);
call MAPL_GetResource(MAPL, USE_PYMOIST_GFDL1M_DRIVER, 'USE_PYMOIST_GFDL1M_DRIVER:', default=.FALSE., RC=STATUS); VERIFY_(STATUS);
#endif

end subroutine GFDL_1M_Initialize
Expand Down Expand Up @@ -371,6 +374,16 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
integer :: IM,JM,LM
integer :: I, J, L

#ifdef PYMOIST_INTEGRATION
integer :: NX, NY
type(gfdl_1m_flags_interface_type) :: gfdl_1m_flags
logical :: init_gfdl_1m_flags = .true.
! IEEE trapping see below
logical :: halting_mode(5)
real :: start, finish
integer :: comm, rank, mpierr
#endif

call ESMF_GridCompGet( GC, CONFIG=CF, RC=STATUS )
VERIFY_(STATUS)

Expand Down Expand Up @@ -592,7 +605,7 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
! evap/subl/pdf
call MAPL_GetPointer(EXPORT, RHCRIT3D, 'RHCRIT', ALLOC=.TRUE., RC=STATUS); VERIFY_(STATUS)
#ifdef PYMOIST_INTEGRATION
IF (USE_PYMOIST_GFDL1M) THEN
IF (USE_PYMOIST_GFDL1M_EVAP) THEN
call pymoist_interface_f_run_GFDL1M( &
dw_land, dw_ocean, PDFSHAPE, TURNRHCRIT_PARAM, &
DT_MOIST, CCW_EVAP_EFF, CCI_EVAP_EFF, &
Expand Down Expand Up @@ -821,6 +834,47 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
! GRAUPEL
RAD_QG = QGRAUPEL
! Run the driver
#ifdef PYMOIST_INTEGRATION
if (init_gfdl_1m_flags) then
init_gfdl_1m_flags = .false.
call make_gfdl_1m_flags_C_interop(LPHYS_HYDROSTATIC, LHYDROSTATIC, do_qa, fix_negative, fast_sat_adj, &
const_vi, const_vs, const_vg, const_vr, use_ccn, do_bigg, do_evap, &
do_subl, z_slope_liq, z_slope_ice, prog_ccn, preciprad, use_ppm, &
mono_prof, do_sedi_heat, sedi_transport, do_sedi_w, de_ice, mp_print, &
dt_moist, mp_time, t_min, t_sub, tau_r2g, tau_smlt, tau_g2r, &
dw_land, dw_ocean, vi_fac, vr_fac, vs_fac, vg_fac, ql_mlt, vi_max, &
vs_max, vg_max, vr_max, qs_mlt, qs0_crt, qi_gen, ql0_max, qi0_max, &
qi0_crt, qr0_crt, rh_inc, rh_ins, rh_inr, rthreshu, rthreshs, ccn_l, &
ccn_o, qc_crt, tau_g2v, tau_v2g, tau_s2v, tau_v2s, tau_revp, tau_frz, &
sat_adj0, c_piacr, tau_imlt, tau_v2l, tau_l2v, tau_i2v, tau_i2s, &
tau_l2r, qi_lim, ql_gen, c_paut, c_psaci, c_pgacs, c_pgaci, c_cracw, &
alin, clin, cld_min, icloud_f, irain_f, gfdl_1m_flags)
call gfdl_1m_interface_f_init(gfdl_1m_flags)
endif
IF (USE_PYMOIST_GFDL1M_DRIVER) THEN
C_LHYDROSTATIC = LHYDROSTATIC
C_LPHYS_HYDROSTATIC = LPHYS_HYDROSTATIC
call pymoist_interface_f_run_GFDL_1M_driver( &
! Input water/cloud species and liquid+ice CCN [NACTL+NACTI (#/m^3)]
RAD_QV, RAD_QL, RAD_QR, RAD_QI, RAD_QS, RAD_QG, RAD_CF, (NACTL+NACTI), &
! Output tendencies
DQVDTmic, DQLDTmic, DQRDTmic, DQIDTmic, &
DQSDTmic, DQGDTmic, DQADTmic, DTDTmic, &
! Input fields
T, W, U, V, DUDTmic, DVDTmic, DZ, DP, &
! constant inputs
AREA, DT_MOIST, FRLAND, CNV_FRC, SRF_TYPE, EIS, &
RHCRIT3D, ANV_ICEFALL, LS_ICEFALL, &
! Output rain re-evaporation and sublimation
REV_LS, RSU_LS, &
! Output precipitates
PRCP_RAIN, PRCP_SNOW, PRCP_ICE, PRCP_GRAUPEL, &
! Output mass flux during sedimentation (Pa kg/kg)
PFL_LS(:,:,1:LM), PFI_LS(:,:,1:LM), &
! constant grid/time information
C_LHYDROSTATIC, C_LPHYS_HYDROSTATIC)
ELSE
#endif
call gfdl_cloud_microphys_driver( &
! Input water/cloud species and liquid+ice CCN [NACTL+NACTI (#/m^3)]
RAD_QV, RAD_QL, RAD_QR, RAD_QI, RAD_QS, RAD_QG, RAD_CF, (NACTL+NACTI), &
Expand All @@ -841,6 +895,9 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
! constant grid/time information
LHYDROSTATIC, LPHYS_HYDROSTATIC, &
1,IM, 1,JM, 1,LM, 1, LM)
#ifdef PYMOIST_INTEGRATION
ENDIF ! USE_PYMOIST_GFDL1M_DRIVER
#endif
! Apply tendencies
T = T + DTDTmic * DT_MOIST
U = U + DUDTmic * DT_MOIST
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5334,7 +5334,7 @@ subroutine RUN ( GC, IMPORT, EXPORT, CLOCK, RC )
! to run initialization
call MAPL_GetResource(MAPL, USE_PYMOIST_AER, 'USE_PYMOIST_AER:', default=.false., RC=STATUS); VERIFY_(STATUS);
call ESMF_AttributeGet(AERO, name='number_of_aerosol_modes', value=n_modes, __RC__)
if (USE_PYMOIST_AER .and. init_pymoist) then
if (init_pymoist) then
call cpu_time(start)
init_pymoist = .false.
call MAPL_Get(MAPL, IM=IM, JM=JM, LM=LM, INTERNAL_ESMF_STATE=INTERNAL, RC=STATUS ); VERIFY_(STATUS)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from ndsl.dsl.typing import Float
from pyMoist.GFDL_1M.driver.config import MicrophysicsConfiguration


def check_flags(
GFDL_1M_config: MicrophysicsConfiguration,
dts: Float,
):
"""
Checks for any flags that are no meeting the expected value.
Failing flags are likely not implemetned,
or at the very least not fully implemented
"""
failed_keywords = []
if not GFDL_1M_config.PHYS_HYDROSTATIC:
failed_keywords.append("phys_hydrostatic")
if GFDL_1M_config.HYDROSTATIC:
failed_keywords.append("hydrostatic")
if GFDL_1M_config.CONST_VI:
failed_keywords.append("const_vi")
if GFDL_1M_config.CONST_VS:
failed_keywords.append("const_vs")
if GFDL_1M_config.CONST_VG:
failed_keywords.append("const_vg")
if GFDL_1M_config.CONST_VR:
failed_keywords.append("const_vr")
if GFDL_1M_config.USE_PPM:
failed_keywords.append("use_ppm")
if not GFDL_1M_config.USE_CCN:
failed_keywords.append("use_ccn")
if GFDL_1M_config.DO_QA:
failed_keywords.append("do_qa")
if not GFDL_1M_config.FIX_NEGATIVE:
failed_keywords.append("fix_negative")
if GFDL_1M_config.FAST_SAT_ADJ:
failed_keywords.append("fast_sat_adj")
if GFDL_1M_config.DO_BIGG:
failed_keywords.append("do_bigg")
if GFDL_1M_config.DO_EVAP:
failed_keywords.append("do_evap")
if GFDL_1M_config.DO_SUBL:
failed_keywords.append("do_subl")
if not GFDL_1M_config.Z_SLOPE_LIQ:
failed_keywords.append("z_slope_liq")
if not GFDL_1M_config.Z_SLOPE_ICE:
failed_keywords.append("z_slope_ice")
if not GFDL_1M_config.PROG_CCN:
failed_keywords.append("prog_ccn")
if not GFDL_1M_config.PRECIPRAD:
failed_keywords.append("preciprad")
if not GFDL_1M_config.MONO_PROF:
failed_keywords.append("mono_prof")
if GFDL_1M_config.DO_SEDI_HEAT:
failed_keywords.append("do_sedi_heat")
if not GFDL_1M_config.SEDI_TRANSPORT:
failed_keywords.append("sedi_transport")
if GFDL_1M_config.DO_SEDI_W:
failed_keywords.append("do_sedi_w")
if GFDL_1M_config.DE_ICE:
failed_keywords.append("de_ice")
if GFDL_1M_config.MP_PRINT:
failed_keywords.append("mp_print")
if dts >= 300:
failed_keywords.append("dts")

if len(failed_keywords) > 0:
raise ValueError(
"One or more namelist parameters do not meet \
expected values. Failing parameters: ",
failed_keywords,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
from ndsl.dsl.typing import Float


class MicrophysicsConfiguration:
def __init__(
self,
PHYS_HYDROSTATIC: bool,
HYDROSTATIC: bool,
DT_MOIST: Float,
MP_TIME: Float,
T_MIN: Float,
T_SUB: Float,
TAU_R2G: Float,
TAU_SMLT: Float,
TAU_G2R: Float,
DW_LAND: Float,
DW_OCEAN: Float,
VI_FAC: Float,
VR_FAC: Float,
VS_FAC: Float,
VG_FAC: Float,
QL_MLT: Float,
DO_QA: bool,
FIX_NEGATIVE: bool,
VI_MAX: Float,
VS_MAX: Float,
VG_MAX: Float,
VR_MAX: Float,
QS_MLT: Float,
QS0_CRT: Float,
QI_GEN: Float,
QL0_MAX: Float,
QI0_MAX: Float,
QI0_CRT: Float,
QR0_CRT: Float,
FAST_SAT_ADJ: bool,
RH_INC: Float,
RH_INS: Float,
RH_INR: Float,
CONST_VI: bool,
CONST_VS: bool,
CONST_VG: bool,
CONST_VR: bool,
USE_CCN: bool,
RTHRESHU: Float,
RTHRESHS: Float,
CCN_L: Float,
CCN_O: Float,
QC_CRT: Float,
TAU_G2V: Float,
TAU_V2G: Float,
TAU_S2V: Float,
TAU_V2S: Float,
TAU_REVP: Float,
TAU_FRZ: Float,
DO_BIGG: bool,
DO_EVAP: bool,
DO_SUBL: bool,
SAT_ADJ0: Float,
C_PIACR: Float,
TAU_IMLT: Float,
TAU_V2L: Float,
TAU_L2V: Float,
TAU_I2V: Float,
TAU_I2S: Float,
TAU_L2R: Float,
QI_LIM: Float,
QL_GEN: Float,
C_PAUT: Float,
C_PSACI: Float,
C_PGACS: Float,
C_PGACI: Float,
Z_SLOPE_LIQ: bool,
Z_SLOPE_ICE: bool,
PROG_CCN: bool,
C_CRACW: Float,
ALIN: Float,
CLIN: Float,
PRECIPRAD: bool,
CLD_MIN: Float,
USE_PPM: bool,
MONO_PROF: bool,
DO_SEDI_HEAT: bool,
SEDI_TRANSPORT: bool,
DO_SEDI_W: bool,
DE_ICE: bool,
ICLOUD_F: Float,
IRAIN_F: Float,
MP_PRINT: bool,
):
self.PHYS_HYDROSTATIC = PHYS_HYDROSTATIC
self.HYDROSTATIC = HYDROSTATIC
self.DT_MOIST = DT_MOIST
self.MP_TIME = MP_TIME
self.T_MIN = T_MIN
self.T_SUB = T_SUB
self.TAU_R2G = TAU_R2G
self.TAU_SMLT = TAU_SMLT
self.TAU_G2R = TAU_G2R
self.DW_LAND = DW_LAND
self.DW_OCEAN = DW_OCEAN
self.VI_FAC = VI_FAC
self.VR_FAC = VR_FAC
self.VS_FAC = VS_FAC
self.VG_FAC = VG_FAC
self.QL_MLT = QL_MLT
self.DO_QA = DO_QA
self.FIX_NEGATIVE = FIX_NEGATIVE
self.VI_MAX = VI_MAX
self.VS_MAX = VS_MAX
self.VG_MAX = VG_MAX
self.VR_MAX = VR_MAX
self.QS_MLT = QS_MLT
self.QS0_CRT = QS0_CRT
self.QI_GEN = QI_GEN
self.QL0_MAX = QL0_MAX
self.QI0_MAX = QI0_MAX
self.QI0_CRT = QI0_CRT
self.QR0_CRT = QR0_CRT
self.FAST_SAT_ADJ = FAST_SAT_ADJ
self.RH_INC = RH_INC
self.RH_INS = RH_INS
self.RH_INR = RH_INR
self.CONST_VI = CONST_VI
self.CONST_VS = CONST_VS
self.CONST_VG = CONST_VG
self.CONST_VR = CONST_VR
self.USE_CCN = USE_CCN
self.RTHRESHU = RTHRESHU
self.RTHRESHS = RTHRESHS
self.CCN_L = CCN_L
self.CCN_O = CCN_O
self.QC_CRT = QC_CRT
self.TAU_G2V = TAU_G2V
self.TAU_V2G = TAU_V2G
self.TAU_S2V = TAU_S2V
self.TAU_V2S = TAU_V2S
self.TAU_REVP = TAU_REVP
self.TAU_FRZ = TAU_FRZ
self.DO_BIGG = DO_BIGG
self.DO_EVAP = DO_EVAP
self.DO_SUBL = DO_SUBL
self.SAT_ADJ0 = SAT_ADJ0
self.C_PIACR = C_PIACR
self.TAU_IMLT = TAU_IMLT
self.TAU_V2L = TAU_V2L
self.TAU_L2V = TAU_L2V
self.TAU_I2V = TAU_I2V
self.TAU_I2S = TAU_I2S
self.TAU_L2R = TAU_L2R
self.QI_LIM = QI_LIM
self.QL_GEN = QL_GEN
self.C_PAUT = C_PAUT
self.C_PSACI = C_PSACI
self.C_PGACS = C_PGACS
self.C_PGACI = C_PGACI
self.Z_SLOPE_LIQ = Z_SLOPE_LIQ
self.Z_SLOPE_ICE = Z_SLOPE_ICE
self.PROG_CCN = PROG_CCN
self.C_CRACW = C_CRACW
self.ALIN = ALIN
self.CLIN = CLIN
self.PRECIPRAD = PRECIPRAD
self.CLD_MIN = CLD_MIN
self.USE_PPM = USE_PPM
self.MONO_PROF = MONO_PROF
self.DO_SEDI_HEAT = DO_SEDI_HEAT
self.SEDI_TRANSPORT = SEDI_TRANSPORT
self.DO_SEDI_W = DO_SEDI_W
self.DE_ICE = DE_ICE
self.ICLOUD_F = ICLOUD_F
self.IRAIN_F = IRAIN_F
self.MP_PRINT = MP_PRINT
Loading