Newer
Older
#!/usr/bin/env python3
# Copyright 2021 - Barcelona Supercomputing Center
# Author: Rodrigo Martín Posada
# MIT License
import pyoasis
from pyoasis import OASIS # pylint: disable=no-name-in-module
import numpy as np
L080_NX = 35718 # number of LAND grid cells at T159 resolution
L128_NX = 88838 # number of LAND grid cells at T255 resolution
L256_NX = 348528 # number of LAND grid cells at T511 resolution
CO2_MODE = False
def def_local_partition(nx, npes, mype):
il_size = nx // npes
il_offset += (nx % npes) - (npes-mype)
# Constants from namelist
nml = f90nml.read(NAMELIST_FILE_NAME)
COUPLING_INTERVAL = nml['NAMAMIP']['TimeStepSec']
RUN_LENGTH_SEC = nml['NAMAMIP']['RunLengthSec']
# Init OASIS
local_comm = comp.localcomm
# Get rank in local communicator
mype = comp.localcomm.rank
npes = comp.localcomm.size
# Unit for output messages
logging.basicConfig(filename=out_ifs, format='%(message)s', level=logging.DEBUG)
logging.debug('-----------------------------------------------------------')
logging.debug('I am IFS-mock process with rank : {}'.format(mype))
logging.debug('in my local communicator gathering {} processes'.format(npes))
logging.debug('----------------------------------------------------------')
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# PARTITION DEFINITION
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
with open('namcouple', 'r') as f:
contents = f.read()
Etienne Tourigny
committed
if 'CO2_conc' in contents:
if 'L080' in contents:
nx = L080_NX
elif 'L128' in contents:
nx = L128_NX
elif 'L256' in contents:
nx = L256_NX
else:
raise Exception('Invalid IFS grid in namcouple')
il_size, il_offset = def_local_partition(nx, npes, mype)
Etienne Tourigny
committed
logging.debug('il_size = {} il_offset = {} mype = {}'.format(il_size, il_offset, mype))
partition = pyoasis.ApplePartition(il_offset, il_size)
Etienne Tourigny
committed
if CO2_MODE:
Etienne Tourigny
committed
if mype == 0:
logging.debug('Local serial partition')
logging.debug('nx_co2 = {} mype = {}'.format(nx_co2, mype))
partition2 = pyoasis.SerialPartition(nx_co2)
Etienne Tourigny
committed
else:
Etienne Tourigny
committed
partition2 = None
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# DECLARATION OF THE COUPLING FIELDS
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A_SST = pyoasis.Var("A_SST", partition, OASIS.IN)
A_Ice_frac = pyoasis.Var("A_Ice_frac", partition, OASIS.IN)
logging.debug('var_id A_SST, var_id A_Ice_frac {} {}'.format(A_SST._id, A_Ice_frac._id))
if CO2_MODE:
Etienne Tourigny
committed
A_CO2_emis = pyoasis.Var("A_CO2_emis", partition, OASIS.IN)
logging.debug('var_id A_CO2_emis {}'.format(A_CO2_emis._id))
if mype == 0:
A_CO2_cconc = pyoasis.Var("A_CO2_cconc", partition2, OASIS.IN)
logging.debug('var_id A_CO2_cconc {}'.format(A_CO2_cconc._id))
A_CO2_econc = pyoasis.Var("A_CO2_econc", partition2, OASIS.IN)
logging.debug('var_id A_CO2_econc {}'.format(A_CO2_cconc._id))
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# TERMINATION OF DEFINITION PHASE
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
comp.enddef()
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# TIME STEP LOOP
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
logging.debug('Timestep, field min, mean and max value')
field_recv_A_SST = pyoasis.asarray(np.full(il_size, -1.0))
field_recv_A_Ice_frac = pyoasis.asarray(np.full(il_size, -1.0))
Etienne Tourigny
committed
field_recv_A_CO2_emis = pyoasis.asarray(np.full(il_size, -1.0))
field_recv_A_CO2_cconc = pyoasis.asarray(np.full(nx_co2, -1.0))
field_recv_A_CO2_econc = pyoasis.asarray(np.full(nx_co2, -1.0))
for itap_sec in range(0, RUN_LENGTH_SEC, COUPLING_INTERVAL):
A_SST.get(itap_sec, field_recv_A_SST)
A_Ice_frac.get(itap_sec, field_recv_A_Ice_frac)
logging.debug('ITAP_SEC: {}'.format(itap_sec))
logging.debug('A_SST -> {:.3e} {:.3e} {:.3e}'.format(
np.min(field_recv_A_SST),
np.mean(field_recv_A_SST),
np.max(field_recv_A_SST)))
logging.debug('A_Ice_frac -> {:.3e} {:.3e} {:.3e}'.format(
np.min(field_recv_A_Ice_frac),
np.mean(field_recv_A_Ice_frac),
np.max(field_recv_A_Ice_frac)))
if CO2_MODE:
Etienne Tourigny
committed
A_CO2_emis.get(itap_sec, field_recv_A_CO2_emis)
logging.debug('A_CO2_emis -> {:.3e} {:.3e} {:.3e}'.format( np.min(field_recv_A_CO2_emis), np.mean(field_recv_A_CO2_emis), np.max(field_recv_A_CO2_emis)))
if mype == 0:
A_CO2_cconc.get(itap_sec, field_recv_A_CO2_cconc)
logging.debug('A_CO2_cconc -> {:.3e} {:.3e} {:.3e}'.format( np.min(field_recv_A_CO2_cconc), np.mean(field_recv_A_CO2_cconc), np.max(field_recv_A_CO2_cconc)))
A_CO2_econc.get(itap_sec, field_recv_A_CO2_econc)
logging.debug('A_CO2_econc -> {:.3e} {:.3e} {:.3e}'.format( np.min(field_recv_A_CO2_econc), np.mean(field_recv_A_CO2_econc), np.max(field_recv_A_CO2_econc)))
logging.debug('--------------------------------------\n')
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# TERMINATION
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++