[MITgcm-devel] problem with exf_getffieldrec and obcs
Martin Losch
Martin.Losch at awi.de
Tue Jun 2 10:45:16 EDT 2009
You are absolutely rights, it's a _RL variable. I just copied code
from some other part of exf where this is done frequently, but that's
no excuse. I'll change that first.
Martin
On Jun 2, 2009, at 3:57 PM, Jean-Michel Campin wrote:
> Hi Martin,
>
> Just a detail: obcsperiod is _RL or integer ?
> could be more consistent to have the same type of comparaison:
> in the 3 cases (with . _d 0 if _RL):
>>> if ( obcsperiod .eq. -12 ) then
>>> elseif ( obcsperiod .eq. 0. _d 0 ) then
>>> elseif ( obcsperiod .lt. 0 ) then
>
> Otherwise, I don't know much about this EXF bit of code,
> but may be a kind of safer way would be not to divide
> by obcsperiod if it's zero (like we do in DIFFERENT_MULTIPLE
> and DIFF_PHASE_MULTIPLE). But this could be changed later.
>
> Jean-Michel
>
> On Tue, Jun 02, 2009 at 02:50:31PM +0200, Martin Losch wrote:
>> Hi all,
>>
>> exf_getffieldrec divides by fldperiod. That means, if it is called
>> with
>> fldperiod=0, it produces nonsense for count1/count2. Originally
>> it's not
>> called with fldperiod=0, because in that case exf_set_gen is never
>> called, but only exf_init_gen, where this case is handled.
>>
>> However, now this function is also used in obcs_prescribe_exf_yz/xz
>> (obcs_prescribe_read.F) where it is possible to have fldperiod=0. I
>> have
>> fixed this by including this code:
>>> if ( obcsperiod .eq. -12 ) then
>>> c obcsperiod=-12 means input file contains 12 monthly means
>>> c record numbers are assumed 1 to 12 corresponding to
>>> c Jan. through Dec.
>>> call cal_GetMonthsRec(
>>> O fac, first, changed,
>>> O count0, count1,
>>> I mycurrenttime, mycurrentiter, mythid
>>> & )
>>
>>> elseif ( obcsperiod .eq. 0. _d 0 ) then
>>> c this is clearly a hack: we set the values of fac, first,
>>> changed,
>>> c etc. to read only the first record and only if
>>> mycurrentiter=niter0
>>> fac = 1. _d 0
>>> first = ((mycurrenttime - modelstart) .lt. 0.5*modelstep)
>>> changed = .false.
>>> count0 = 1
>>> count1 = count0
>>> elseif ( obcsperiod .lt. 0 ) then
>>> print *, 'obcsperiod is out of range'
>>> STOP 'ABNORMAL END: S/R OBCS_PRESCIBE_EXF_XZ'
>>> else
>>> c get record numbers and interpolation factor
>>> call exf_GetFFieldRec(
>>> I obcsstartdate, obcsperiod,
>>> I useYearlyFields,
>>> O fac, first, changed,
>>> O count0, count1, year0, year1,
>>> I mycurrenttime, mycurrentiter, mythid
>>> & )
>>> endif
>>>
>> which works for me, but I wonder if there is a better, and more
>> elegant
>> way of doing this, maybe within exf_getffieldrec (otherwise I am
>> going to
>> check in this hack, because I need this feature).
>>
>> Martin
>>
>> _______________________________________________
>> MITgcm-devel mailing list
>> MITgcm-devel at mitgcm.org
>> http://mitgcm.org/mailman/listinfo/mitgcm-devel
> _______________________________________________
> MITgcm-devel mailing list
> MITgcm-devel at mitgcm.org
> http://mitgcm.org/mailman/listinfo/mitgcm-devel
More information about the MITgcm-devel
mailing list