#include "geminc.h" #include "gemprm.h" #include "dbcmn.h" #include "dg.h" void dgc_nfil ( const char *gdfile, const char *gdoutf, int *iret ) /************************************************************************ * dgc_nfil * * * * This subroutine opens grid files and initializes the grid * * diagnostics package. * * * * dgc_nfil ( gdfile, dgoutf, iret ) * * * * Input parameters: * * *gdfile const char Grid file name or template * * *gdoutf const char Output grid file name * * * * Output parameters: * * *iret int Return code * * 0 = normal return * * -30 = error opening file * * -33 = too many files to open * * -51 = path associated with * * template does not exist * * -62 = grid file open failed * ** * * Log: * * R. Tian/SAIC 10/03 * * K. Brill/HPC 1/04 Init time list if same GDFILE input * * R. Tian/SAIC 2/03 Removed gdfprv and gdoprv * * K. Brill/HPC 2/04 Remove setting dgsubg = .true.; add * * setting nucode = .true. * * R. Tian/SAIC 3/04 Modified to use new GD file management * * T. Lee/SAIC 9/04 Replaced FL_TMPL with CTB_DTGET * * T. Lee/SAIC 10/04 Fixed return code * * R. Tian/SAIC 10/04 Changed template tfirst/tlast compu * * A. Hardy/NCEP 11/04 Added calls to ST_RNUL * * m.gamazaychikov/SAIC 12/04 Added ion flag to CTB_DTGET call seq. * * T. Lee/SAIC 12/04 Added ensemble DE_ functions * * R. Tian/SAIC 1/06 Recoded from Fortran * * m.gamazaychikov/SAIC 04/06 Added idtmch flag to CTB_DTGET CS * * R. Tian/SAIC 07/06 Fixed some error processing * * R. Tian/SAIC 01/07 Fixed bug when template w/o base time * * S. Gilbert/NCEP 02/07 Increased size of filnms * * T. Piper/SAIC 04/07 Modified for cfl_scnt CSC * * M. Li/SAIC 10/07 Add check for files found after cfl_scnt* * F. J. Yen/NCEP 4/08 Added bin mins & mstrct to CTG_DTGET CSC* ***********************************************************************/ { char tmpfil[MXFLSZ], filnam[MXFLSZ], cpath[MXFLSZ], tmplt[65], dumdtm[DTTMSZ], rplc[DTTMSZ]; char **filnms, **carr=NULL; float adum1, adum2; long flen; int nfile, ifn, mxgd, ngrd, ncarr, ic, is, iff, ir, iint, ion, ihb, mnb, iha, mna, idtmch, mstrct, ii, im1, kk, zero, ier, ierm; int exist; struct dirent **dnlist=NULL; char diagMessage[720],**fhrs,*def = " ",ingdtm[41]; int nfarr; /*----------------------------------------------------------------------*/ *iret = 0; zero = 0; _nfile.nucode = G_TRUE; sprintf (diagMessage, "%s%s", "gdfile= ", gdfile); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); /* * Close any previously opened file. */ for ( ii = 1; ii <= NGDFLS; ii++ ) { dg_clos ( &ii, &ier ); } /* * Initialize the ensemble common block. */ de_init ( &ier ); /* * Initialize /NFILE/ common block. */ for ( ii = 0; ii < NGDFLS; ii++ ) { _nfile.ntmplt[ii][0] = '\0'; _nfile.gflpth[ii][0] = '\0'; _nfile.crtfnm[ii][0] = '\0'; _nfile.aftrbr[ii][0] = '\0'; _nfile.crtgdt1[ii][0] = '\0'; _nfile.crtgdt2[ii][0] = '\0'; _nfile.outflg[ii] = G_FALSE; _nfile.mbrnum[ii] = 0; } for ( ii = 0; ii < LLMXGT; ii++ ) { _nfile.dtmlst1[ii][0] = '\0'; _nfile.dtmlst2[ii][0] = '\0'; } _nfile.ntmlst = 0; _nfile.itmlst = 0; _nfile.irefnv = 0; /* * Get the individual input file names. */ filnms = (char **)cmm_malloc2d ( NGDFLS, /*LLMXLN*/LLNNAV+1, sizeof(char), &ier ); if ( filnms == NULL ) { *iret = -73; return; } cst_clst ( (char *)gdfile, '+', " ", NGDFLS, /*LLMXLN*/ LLNNAV, filnms, &nfile, &ier ); if ( nfile > NGDFLS || ier != 0 ) { cmm_free2d( (void **)filnms, &ier ); *iret = -33; return; } /* * Check for the output file to be included among the input files. */ if ( strlen ( gdoutf ) > 0 ) { exist = G_FALSE; for ( ii = 1; ii <= nfile; ii++ ) { im1 = ii - 1; if ( strcmp ( gdoutf, filnms[im1] ) == 0 ) { _nfile.outflg[im1] = G_TRUE; _nfile.irefnv = im1; exist = G_TRUE; } } if ( exist == G_FALSE ) { nfile += 1; if ( nfile > NGDFLS ) { cmm_free2d( (void **)filnms, &ier ); *iret = -33; return; } strcpy ( filnms[nfile-1], gdoutf ); _nfile.outflg[nfile-1] = G_TRUE; _nfile.irefnv = nfile - 1; } } /* * Loop over all of the entries */ for ( ii = 1; ii <= nfile; ii++ ) { im1 = ii - 1; // printf ("DGC_NFIL ii=%d filnms = %s\n", ii, filnms[im1]); sprintf (diagMessage, "%s", "start the loop over entries"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); sprintf (diagMessage, "%s %d %s %s", "calling de_mbr1 with ii=", ii, "filnms[im1]= ", filnms[im1]); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); de_mbr1 ( &ii, filnms[im1], tmpfil, &ier ); // printf ("DGC_NFIL after de_mbr1 tmpfil = %s ier = %d\n", tmpfil, &ier); sprintf (diagMessage, "%s %d %s %s", "after de_mbr1 ier=", ier, "tmpfil= ", tmpfil); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); cfl_inqr ( tmpfil, NULL, &flen, filnam, &ier ); // printf ("DGC_NFIL after cfl_inqr filnam = %s ier = %d\n", filnam, &ier); sprintf (diagMessage, "%s %d %s %s", "after cfl_inqr ier=", ier, "filnam= ", filnam); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier == 0) { /* * This entry is an actual file. */ sprintf (diagMessage, "%s", "this entry is a file"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); strcpy ( _nfile.crtfnm[im1], filnam ); // printf ("DGC_NFIL calling gd_open\n"); sprintf (diagMessage, "%s", "calling gd_open"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); gd_open ( filnam, &_nfile.outflg[im1], &zero, &zero, &ifn, &adum1, &adum2, &mxgd, &ier, strlen(filnam) ); // printf ("DGC_NFIL after gd_open ier=%d\n", &ier); sprintf (diagMessage, "%s %d", "after gd_open ier=", ier); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier != 0 ) { cmm_free2d( (void **)filnms, &ier ); *iret = -62; return; } // printf ("DGC_NFIL calling cgd_ngrd\n"); sprintf (diagMessage, "%s", "calling cgd_ngrd"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); cgd_ngrd ( ifn, &ngrd, _dgfile.tfirst[im1], _dgfile.tlast[im1], &ier ); sprintf (diagMessage, "%s %d", "after cgd_ngrd ier=", ier); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier != 0 ) { cmm_free2d( (void **)filnms, &ier ); *iret = -30; return; } _dgfile.tmpflg[im1] = G_FALSE; _dgfile.templt[im1][0] = '\0'; } else { /* * This entry is a template. */ sprintf (diagMessage, "%s", "this entry is a TEMPLATE"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); carr = (char **)cmm_malloc2d ( 2, MXFLSZ, sizeof(char), &ier ); if ( carr == NULL ) { cmm_free2d( (void **)filnms, &ier ); *iret = -73; return; } cst_clst ( tmpfil, '|', " ", 2, MXFLSZ, carr, &ncarr, &ier ); strcpy ( tmpfil, carr[0] ); if ( ncarr == 2 ) { strcpy ( _nfile.aftrbr[im1], carr[1] ); } cmm_free2d( (void **)carr, &ier ); exist = G_TRUE; sprintf (diagMessage, "%s %s", "before ctb_dtget tmpfil=", tmpfil); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); ctb_dtget ( tmpfil, cpath, tmplt, &ic, &is, &iff, &ir, &iint, &ion, &ihb, &mnb, &iha, &mna, &mstrct, &idtmch, &ier ); // printf ("DGC_NFIL after ctb_dtget cpath = %s\n", cpath); // printf ("DGC_NFIL after ctb_dtget tmplt= %s\n", tmplt); // printf ("DGC_NFIL after ctb_dtget ier = %d\n", &ier); sprintf (diagMessage, "%s %s %s %s %s %d", "after ctb_dtget cpath=", cpath, " tmplt=", tmplt, " ier=", ier); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier != 0 ) exist = G_FALSE; if ( ( strstr ( cpath, "A2DB" ) ) == NULL) { cfl_inqr ( cpath, NULL, &flen, filnam, &ier ); if ( ier != 0 ) exist = G_FALSE; } else { /* * change for the ensemble stuff */ strcpy ( filnam,cpath); } if ( exist == G_FALSE ) { cmm_free2d( (void **)filnms, &ier ); *iret = -51; return; } /* * First, check if templt contains base time pattern. If not, * it is a file name. */ if ( ! ( strstr ( tmplt, "YY" ) && strstr ( tmplt, "DD" ) ) ) { // printf ("DGC_NFIL it is a FILENAME\n"); sprintf (diagMessage, "%s", "it is a FILENAME"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); strcpy ( _nfile.crtfnm[im1], cpath ); strcat ( _nfile.crtfnm[im1], "/" ); strcat ( _nfile.crtfnm[im1], tmplt ); // printf ("DGC_NFIL calling gd_open \n"); sprintf (diagMessage, "%s", "calling gd_open"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); gd_open ( _nfile.crtfnm[im1], &_nfile.outflg[im1], &zero, &zero, &ifn, &adum1, &adum2, &mxgd, &ier, strlen(_nfile.crtfnm[im1]) ); // printf ("DGC_NFIL after gd_open ier=%d\n", &ier); sprintf (diagMessage, "%s %d", "after gd_open ier=", ier); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier != 0 ) { cmm_free2d( (void **)filnms, &ier ); *iret = -62; return; } // printf ("DGC_NFIL calling cgd_ngrd\n"); sprintf (diagMessage, "%s", "calling cgd_ngrd"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); cgd_ngrd ( ifn, &ngrd, _dgfile.tfirst[im1], _dgfile.tlast[im1], &ier ); // printf ("DGC_NFIL after cgd_ngrd ier=%d\n", &ier); sprintf (diagMessage, "%s %d", "after cgd_ngrd ier=", ier); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); if ( ier != 0 ) { cmm_free2d( (void **)filnms, &ier ); *iret = -30; return; } _dgfile.tmpflg[im1] = G_FALSE; _dgfile.templt[im1][0] = '\0'; } else { // printf ("DGC_NFIL it is a TEMPLATE\n"); sprintf (diagMessage, "%s", "it is a TEMPLATE"); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); strcpy ( _nfile.ntmplt[im1], tmplt ); strcpy ( _nfile.gflpth[im1], filnam ); strcpy ( _dgfile.templt[im1], tmplt ); _dgfile.tmpflg[im1] = G_TRUE; /* * Get the first and the last time for the given cycle if * user specifies a cycle in the GDFILE input, or for the * last cycle in the dataset if user does not specify a * cycle in the GDFILE input. */ if ( _nfile.aftrbr[im1][0] != '\0' ) { cti_stan ( _nfile.aftrbr[im1], "YYMMDD/HHNN", dumdtm, &ier ); if ( strstr ( tmplt, "YYYY" ) ) { strcpy ( rplc, "YY" ); strncat ( rplc, dumdtm, 6 ); rplc[8] = '\0'; cst_rpst ( tmplt, "YYYYMMDD", rplc, tmplt, &ier ); } else { cst_ncpy ( rplc, dumdtm, 6, &ier ); cst_rpst ( tmplt, "YYMMDD", rplc, tmplt, &ier ); } cst_ncpy ( rplc, &dumdtm[7], 2, &ier ); cst_rpst ( tmplt, "HH", rplc, tmplt, &ier ); dg_cget ( "INGDTM", ingdtm, &ier ); } else { if ( fhrsClbkPtr != NULL ) { fhrsClbkPtr(); } sprintf (diagMessage, "%s %s", "Forecast Hour fhrsStrBack=", fhrsStrBack); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); fhrs = (char **)cmm_malloc2d ( 2, MXFLSZ, sizeof(char), &ier ); cst_clst ( fhrsStrBack, '/', def, 2, MXFLSZ, fhrs, &nfarr, &ier ); if ( strstr ( tmplt, "YYYY" ) ) { strcpy ( rplc, "YY" ); strncat ( rplc, fhrs[0], 6 ); rplc[8] = '\0'; cst_rpst ( tmplt, "YYYYMMDD", rplc, tmplt, &ier ); } else { cst_ncpy ( rplc, fhrs[0], 6, &ier ); cst_rpst ( tmplt, "YYMMDD", rplc, tmplt, &ier ); } cst_ncpy ( rplc, fhrs[1], 2, &ier ); cst_rpst ( tmplt, "HH", rplc, tmplt, &ier ); cst_clst ( fhrsStrBack, 'f', def, 2, MXFLSZ, fhrs, &nfarr, &ier ); cst_ncpy ( rplc, fhrs[1], 3, &ier ); cst_rpst ( tmplt, "FFF", rplc, tmplt, &ier ); cmm_free2d((void **)fhrs,&ier); } /* * Search the last file that matches the partially filled * template, and open it to get the last time. */ sprintf (diagMessage, "%s %s", "calling cfl_scnt with _nfile.gflpth[im1]=", _nfile.gflpth[im1]); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); sprintf (diagMessage, "%s %s", "calling cfl_scnt with tmplt=", tmplt); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); cfl_scnt ( _nfile.gflpth[im1], tmplt, -1, &dnlist, &ncarr, &ier ); //sprintf (diagMessage, "%s %s", "after cfl_scnt dnlist[0]->d_name=", dnlist[0]->d_name); //db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); sprintf (diagMessage, "%s %d", "after cfl_scnt ncarr=", ncarr); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); tmpfil[0] = '\0'; if (ncarr > 0 ) strcpy ( tmpfil, dnlist[0]->d_name ); for (kk=0;kkd_name=", dnlist[0]->d_name); //db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); sprintf (diagMessage, "%s %d", "after cfl_scnt ncarr=", ncarr); db_msgcave ("dgc_nfil", "debug", diagMessage, &ierm); tmpfil[0] = '\0'; if (ncarr > 0 ) strcpy ( tmpfil, dnlist[0]->d_name ); for (kk=0;kk