--- MITgcm/model/src/the_model_main.F 1998/06/22 15:26:26 1.15 +++ MITgcm/model/src/the_model_main.F 1999/08/30 18:29:27 1.31 @@ -1,6 +1,6 @@ -C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/model/src/the_model_main.F,v 1.15 1998/06/22 15:26:26 adcroft Exp $ +C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/model/src/the_model_main.F,v 1.31 1999/08/30 18:29:27 adcroft Exp $ -#include "CPP_EEOPTIONS.h" +#include "CPP_OPTIONS.h" SUBROUTINE THE_MODEL_MAIN(myThid) C /==========================================================\ @@ -22,6 +22,7 @@ C | C*P* comments indicating place holders for which code is | C | presently being developed. | C \==========================================================/ + IMPLICIT NONE C C Call Tree C ========= @@ -84,9 +85,11 @@ #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" -#include "CG2D.h" #include "DYNVARS.h" -#include "AVER.h" +#include "CG2D.h" +#ifdef ALLOW_NONHYDROSTATIC +#include "CG3D.h" +#endif C == Routine arguments == C myThid - Thread number for this instance of the routine. @@ -102,29 +105,65 @@ C myCurrentTime - Time counter for this thread C I - Loop counter INTEGER I, myCurrentIter - REAL myCurrentTime + _RL myCurrentTime + +C-- This timer encompasses the whole code + CALL TIMER_START('ALL',myThid) + + CALL TIMER_START('SPIN-UP',myThid) C-- Set model initial conditions + CALL TIMER_START('INITIALISE [SPIN-UP]',myThid) CALL INITIALISE( myThid ) myCurrentTime = startTime myCurrentIter = nIter0 + CALL TIMER_STOP ('INITIALISE [SPIN-UP]',myThid) C-- Dump for start state + CALL TIMER_START('I/O (WRITE) [SPIN-UP]',myThid) CALL WRITE_STATE( .TRUE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [SPIN-UP]',myThid) + + CALL TIMER_STOP ('SPIN-UP',myThid) C-- Begin time stepping loop + CALL TIMER_START('MAIN LOOP',myThid) DO I=1, nTimeSteps C-- Load forcing/external data fields + CALL TIMER_START('I/O (READ) [MAIN LOOP]',myThid) CALL LOAD_EXTERNAL_FIELDS( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (READ) [MAIN LOOP]',myThid) + +#ifdef INCLUDE_SHAPIRO_FILTER_CODE +C-- Step forward all tiles, filter and exchange. + CALL TIMER_START('SHAP_FILT [MAIN LOOP]',myThid) + CALL SHAP_FILT( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('SHAP_FILT [MAIN LOOP]',myThid) +#endif C-- Step forward fields and calculate time tendency terms + CALL TIMER_START('DYNAMICS [MAIN LOOP]',myThid) CALL DYNAMICS( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('DYNAMICS [MAIN LOOP]',myThid) + +#ifdef ALLOW_NONHYDROSTATIC +C-- Step forward W field in N-H algorithm + IF ( nonHydrostatic ) THEN + CALL TIMER_START('CALC_GW [MAIN LOOP]',myThid) + CALL CALC_GW( myThid) + CALL TIMER_STOP ('CALC_GW [MAIN LOOP]',myThid) + ENDIF +#endif C-- Do time averages +#ifdef INCLUDE_DIAGNOSTICS_INTERFACE_CODE + CALL TIMER_START('I/O (WRITE) [MAIN LOOP]',myThid) IF (taveFreq.GT.0.) THEN - CALL DO_TIME_AVERAGES( myCurrentTime, myCurrentIter, myThid ) + CALL WRITE_TIME_AVERAGES( myCurrentTime, myCurrentIter, myThid ) ENDIF + CALL TIMER_STOP ('I/O (WRITE) [MAIN LOOP]',myThid) +#endif C-- Do IO if needed. C Note: @@ -132,15 +171,21 @@ C At this point model arrays hold U,V,T,S at "time-level" N C and cg2d_x at "time-level" N-1/2 where N = I+timeLevBase-1. C By convention this is taken to be the model "state". + CALL TIMER_START('I/O (WRITE) [MAIN LOOP]',myThid) CALL DO_THE_MODEL_IO( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [MAIN LOOP]',myThid) C-- Solve elliptic equation(s). C Two-dimensional only for conventional hydrostatic or C three-dimensional for non-hydrostatic and/or IGW scheme. + CALL TIMER_START('SOLVE_FOR_PRESSURE [MAIN LOOP]',myThid) CALL SOLVE_FOR_PRESSURE( myThid ) + CALL TIMER_STOP ('SOLVE_FOR_PRESSURE [MAIN LOOP]',myThid) C-- Do "blocking" sends and receives for tendency "overlap" terms + CALL TIMER_START('BLOCKING_EXCHANGES [MAIN LOOP]',myThid) CALL DO_GTERM_BLOCKING_EXCHANGES( myThid ) + CALL TIMER_STOP ('BLOCKING_EXCHANGES [MAIN LOOP]',myThid) myCurrentIter = myCurrentIter + 1 myCurrentTime = myCurrentTime + deltaTClock @@ -158,24 +203,57 @@ C cg2d_x.0000000001 in the indexing scheme used for the model C "state" files. This example is referred to as a checkpoint C at time level 1 - CALL WRITE_CHECKPOINT( .FALSE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_START('I/O (WRITE) [MAIN LOOP]',myThid) + CALL + & WRITE_CHECKPOINT( .FALSE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [MAIN LOOP]',myThid) ENDDO + CALL TIMER_STOP ('MAIN LOOP',myThid) + CALL TIMER_START('SPIN-DOWN',myThid) C-- Final checkpoint (incase the in-loop checkpoint was missed) - CALL WRITE_CHECKPOINT( .TRUE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_START('I/O (WRITE) [SPIN-DOWN]',myThid) + CALL + & WRITE_CHECKPOINT( .TRUE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [SPIN-DOWN]',myThid) C-- Step-forward U/V/Theta/Salt for purposes of final I/O dump + CALL TIMER_START('DYNAMICS [SPIN-DOWN]',myThid) CALL DYNAMICS( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('DYNAMICS [SPIN-DOWN]',myThid) + +#ifdef ALLOW_NONHYDROSTATIC + IF ( nonHydrostatic ) THEN +C-- Step forward W field in N-H algorithm + CALL TIMER_START('CALC_GW [SPIN-DOWN]',myThid) + CALL CALC_GW( myThid) + CALL TIMER_STOP ('CALC_GW [SPIN-DOWN]',myThid) + ENDIF +#endif C-- Do time averages +#ifdef INCLUDE_DIAGNOSTICS_INTERFACE_CODE IF (taveFreq.GT.0.) THEN - CALL DO_TIME_AVERAGES( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_START('I/O (WRITE) [SPIN-DOWN]',myThid) + CALL WRITE_TIME_AVERAGES( myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [SPIN-DOWN]',myThid) ENDIF +#endif C-- Dump for end state + CALL TIMER_START('I/O (WRITE) [SPIN-DOWN]',myThid) CALL WRITE_STATE( .FALSE., myCurrentTime, myCurrentIter, myThid ) + CALL TIMER_STOP ('I/O (WRITE) [SPIN-DOWN]',myThid) + + CALL TIMER_STOP ('SPIN-DOWN',myThid) + CALL TIMER_STOP ('ALL',myThid) +C-- Write timer statistics + IF ( myThid .EQ. 1 ) THEN + CALL TIMER_PRINTALL( myThid ) + CALL COMM_STATS + ENDIF RETURN END