C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_main.F,v 1.9 2011/08/31 21:33:50 jmc Exp $ C $Name: $ #include "FLT_OPTIONS.h" C ================================================================== C C Float Package for the MIT Model C C Main Routines: C C o flt_main - Integrates the floats forward and stores C positions and vertical profiles at specific C time intervals. C o flt_readparms - Read parameter file C o flt_init_fixed - Initialise fixed C o flt_init_varia - Initialise the floats C o flt_restart - Writes restart data to file (=> renamed: flt_write_pickup) C C Second Level Subroutines: C C o flt_runga2 - Second order Runga-Kutta inetgration (default) C o flt_exchg - Does a new distribution of floats over tiles C after every integration step. C o flt_up - moves float to the surface (if flag is set) C and stores profiles to file C o flt_down - moves float to its target depth (if flag is set) C o flt_traj - stores positions and data to file C o flt_interp_linear - contains blinear interpolation scheme C o flt_mapping - contains mapping functions & subroutine C o flt_mdsreadvector - modified mdsreadvector to read files C C ToDo: C C o avoid exchanges when arrays empty C o 3D advection of floats C C ================================================================== C C Documentation: C C To be made.... C C C started: Arne Biastoch abiastoch@ucsd.edu 10-Jan-2000 C (adopted from version written by Detlef Stammer C for the old model code) C C changed: Arne Biastoch abiastoch@ucsd.edu 21-JUN-2001 C C ================================================================== CBOP 0 C !ROUTINE: FLT_MAIN C !INTERFACE: SUBROUTINE FLT_MAIN ( I myTime, myIter, myThid ) C !DESCRIPTION: C ================================================================== C SUBROUTINE FLT_MAIN C ================================================================== C o This routine steps floats forward in time and samples the model C state at float position every flt_int_traj time steps. C Also moves the float up and down and samples vertical profiles. C C o Uses 2nd or fourth order runga-kutta C o Spatial interpolation is bilinear close to boundaries and otherwise C a polynomial interpolation. C o Particles are kept in grid space (with position of dp taken as C x(south), y(east) grid cell point) C o Calls profile every flt_int_prof time steps; in that event the C profile over the whole water column is written to file and the C float might be moved upwards to the surface (depending on its C configuration). C ================================================================== C !USES: IMPLICIT NONE C == global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "FLT_SIZE.h" #include "FLT.h" C !INPUT PARAMETERS: C myTime :: current time in simulation C myIter :: current iteration number C myThid :: my Thread Id number _RL myTime INTEGER myIter, myThid C !FUNCTIONS: LOGICAL DIFFERENT_MULTIPLE EXTERNAL C !LOCAL VARIABLES: CEOP #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_ENTER( 'FLT_MAIN', myThid ) #endif C-- integration of the float trajectories #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('FLT_RUNGA*', myThid ) #endif #ifdef FLT_SECOND_ORDER_RUNGE_KUTTA c WRITE(0,*) ' bf call flt_runga2', myIter CALL TIMER_START('FLOATS RUNGA2 [FLT LOOP]',myThid) CALL FLT_RUNGA2( myTime, myIter, myThid ) CALL TIMER_STOP ('FLOATS RUNGA2 [FLT LOOP]',myThid) c WRITE(0,*) ' af call flt_runga2', myIter #else c WRITE(0,*) ' bf call flt_runga4', myIter CALL TIMER_START('FLOATS RUNGA4 [FLT LOOP]',myThid) CALL FLT_RUNGA4( myTime, myIter, myThid ) CALL TIMER_STOP ('FLOATS RUNGA4 [FLT LOOP]',myThid) c WRITE(0,*) ' af call flt_runga4', myIter #endif C-- do exchanges between tiles if necessary #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('FLT_EXCH*', myThid ) #endif CALL TIMER_START('FLOATS EXCHG [FLT LOOP]',myThid) #ifdef ALLOW_EXCH2 CALL FLT_EXCH2( myTime, myIter, myThid ) #else CALL FLT_EXCHG( myTime, myIter, myThid ) #endif CALL TIMER_STOP ('FLOATS EXCHG [FLT LOOP]',myThid) C-- store profiles every flt_int_prof time steps and move floats up and down IF ( DIFFERENT_MULTIPLE( flt_int_prof, myTime, deltaTClock ) & ) THEN #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('FLT_UP', myThid ) #endif CALL TIMER_START('FLOATS UP [FLT LOOP]',myThid) CALL FLT_UP( myTime, myIter, myThid ) CALL TIMER_STOP ('FLOATS UP [FLT LOOP]',myThid) ENDIF #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('FLT_DOWN', myThid ) #endif c WRITE(0,*) ' bf call flt_down', myIter CALL TIMER_START('FLOATS DOWN [FLT LOOP]',myThid) CALL FLT_DOWN( myTime, myIter, myThid ) CALL TIMER_STOP ('FLOATS DOWN [FLT LOOP]',myThid) c WRITE(0,*) ' af call flt_down', myIter C-- store particles every flt_int_traj timesteps: IF ( DIFFERENT_MULTIPLE( flt_int_traj, myTime, deltaTClock ) & ) THEN #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('FLT_TRAJ', myThid ) #endif c WRITE(0,*) ' bf call flt_traj', myIter CALL TIMER_START('FLOATS TRAJ [FLT LOOP]',myThid) CALL FLT_TRAJ( myTime, myIter, myThid ) CALL TIMER_STOP ('FLOATS TRAJ [FLT LOOP]',myThid) c WRITE(0,*) ' af call flt_traj', myIter ENDIF #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_LEAVE( 'FLT_MAIN', myThid ) #endif RETURN END