C+ C NAME: C SetGrid C PURPOSE: C Set the range in Carrington variable to be used for a tomographic reconstruction C CATEGORY: C Tomography: initialization C CALLING SEQUENCE: subroutine SetGrid(bForecast, nCar,JDCar, XCbegMAT,XCendMAT,XCbegROI,XCendROI, & XCtst1,XCtst2,MJDref, bGCamb, MJDfrst,MJDlast,cCam,iEdt, NT) C INPUTS: C bForecast logical C bGCamb logical C OUTPUTS: C nCar integer C JDCar(nCar) real*8 Start times of Carrington rotations (Julian days) C NCoff integer Offset of JDCarr index and Carrington rotation number C C XCbegROI real C XCendROI real C Carrington variables defining 'region of interest': C only used to output part of [XCbeg,XCend] in href=Write3D_nv= C XCbeg real C XCend real C Carrington variables marking limits of arrays C XCtst1 real C XCtst2 real C limits on Carrington variable used to select C lines of sight (passes to ReadVIPS,ReadGIPS) C C Only used by ReadGIPS: C MJDfrst integer Modified Julian day for earliest data file C MJDlast integer Modified Julian day for most recent file C cCam character*(*) logical name for Cambridge directory C iEdt integer 0 = Unedited data; 1 = Edited data C CALLS: C AskI4, AskR4, AskR8, SetGipsy,MAP_TZERO, N_CARRINGTON, Julian, XMAP_SC_POS C Local2UT, SunNewcomb, ECLIPTIC_HELIOGRAPHIC, AdjustJDCar, Say C T3D_iget, T3D_iset, T3D_set, DATE_DOY, FLINT8 C EXTERNAL: external EARTH C INCLUDE: include 'dirspec.h' include 'sun.h' include 't3d_param.h' include 't3d_array.h' C PROCEDURE: C Lots of user prompts C MODIFICATION HISTORY: C SEP-1999, Paul Hick (UCSD/CASS; pphick@ucsd.edu) C- logical bForecast integer nCar real*8 JDCar(nCar) real XCbegMAT(*) real XCendMAT(*) real XCbegROI(*) real XCendROI(*) real XCtst1 real XCtst2 real*8 MJDref logical bGCamb integer MJDfrst integer MJDlast character cCam*(*) integer iEdt integer NT logical bMod real TT / 0.0/ ! Reference time for deconvolution real dTT / 0.0/ ! Time resolution (Carrington variable) real RR / 0.0/ ! Reference distance for deconvolution real dRR / 0.1/ ! Radial resolution (AU) real LATrange(2) /-90.0,90.0/ ! Lower/upper latitude boundary integer iOffUT /8/ real XCmargin / 0.25/ real*8 MJD real*8 JDtmp real*8 FLINT8 real*8 Tiny /0.0d0/ character cMon*3 character cStr*80 character cSay*7 /'SetGrid'/ include 't3d_grid_fnc.h' ! Contains statements functions so DON'T MOVE IT. call Say(' ',' ','Grid','.#.#parameters#.') call T3D_iget(T3D__MODE,0,MODE) bMod = iand(MODE,TOM__MOD) .ne. 0 call T3D_iget(T3D__NLNG,0,nLng) call T3D_iget(T3D__NLAT,0,nLat) call T3D_iget(T3D__NRAD,0,nRad) call T3D_iget(T3D__NTIM,0,nTim) call AskI4('# Longitude grid points per rotation', nLng) call AskI4('# Latitude grid points' , nLat) call AskI4('# Radial grid points' , nRad) call AskI4('# Time steps' , nTim) call AskI4('# UT time steps per day', NT ) call T3D_iset(T3D__NLNG,0,nLng) call T3D_iset(T3D__NLAT,0,nLat) call T3D_iset(T3D__NRAD,0,nRad) call T3D_iset(T3D__NTIM,0,nTim) !------- ! Time-dependent tomography is always done in mod-360 mode if (nTim .gt. 1 .and. .not. bMod) then MODE = MODE+TOM__MOD call T3D_iset(T3D__MODE,0,MODE) call Say(cSay,'W','Mode','Switched to mod-360 calculation') end if call T3D_set (T3D__LAT ,2,LATrange) call AskR4('Source surface distance (AU; 0=solar surface)',RR) if (RR .lt. 0) RR = -RR*SUN__RAU ! Neg. RR are in units of solar radii RR = max(RR,sngl(SUN__RAU)) ! Keep RR > 1 solar radius ! Deconvolve velocity, G-level or both? call AskR4('Radial resolution distance (AU; 0=solar surface)',dRR) if (dRR .lt. 0) dRR = -dRR*SUN__RAU ! Neg. RR are in units of solar radii call T3D_set (T3D__RR ,0, RR ) call T3D_set (T3D__DRR ,0,dRR ) !------- ! iOffUT is an offset time (in hours) between local time and UT. This is used only if the program ! is operated in forecast mode. Note that the local time is assumed to be the same as the ! computer time. The default offset is 8 hours (the difference between PST and GST). if (bForecast) call AskI4('Offset between local time and UT (hours)?',iOffUT) !------- ! Calculate start times for Carrington rotations between 1985 and now. ! Rotation NCoff+I starts at time JDCar(I). iYr = 1985 ! Predates the earliest Nagoya and Cambridge data Doy = 1. call MAP_TZERO(EARTH,iYr,Doy,.01,nCar,JDCar) NCoff = N_CARRINGTON(iYr,Doy) if (bGCamb) then cCam = cEnvi//'cam' ! Sets MJDfrst and MJDlast; iOffUT is not used call SetGipsy(cCam,iOffUT,iEdt,MJDfrst,MJDlast) else MJDfrst = JDCar(1)+1-SUN__MJDtoJD ! MJDfrst corresponds to the start of the JDCar call Local2UT(iOffUT,iYr,Doy) ! .. array. This presents a lower limit on the times selected call Julian(10,iYr,Doy,MJD,JDtmp) MJDlast = MJD+1 end if if (nTim .eq. 1) then ! Steady state tomography if (bForecast) then ! Forecast mode call Local2UT(iOffUT,iYr,Doy) ! Doy = universal time call Julian(10,iYr,Doy,MJD,JDtmp) ! Current time in MJD write (*,'(/,10X,A,I6,A,I6,A,F11.3)') 'First MJD =',MJDfrst,' Last MJD =',MJDlast,' Current MJD =',MJD MJDref = MJD ! MJD at center of region of interest (Earth position) write (cStr,'(A,I5,A,F7.1,A)') '$',MJDfrst,'$',MJD,'$0$' call AskR8('Forecast Modified Julian Day'//cStr,MJDref) call Julian(11,iYr,Doy,MJDref,JDtmp) ! Make sure iYr,Doy match MJDref XCbegMAT(1) = XMAP_SC_POS(EARTH,iYr,Doy,nCar,JDCar)! Carrington variable at center of region of interest !----------- ! Recalculate JDCar array and NCoff based on selected Carrington rotation XCbeg ! (we want all XC* values to be as small as possible to retain as much precision as possible). ! First find the lowest Carrington variable needed. Then call AdjustJDCar. Then get ! back to the center of the region of interest. XCbegMAT(1) = XCbegMAT(1)-0.5 ! Begin of region of interest !if (.not. bMod) XCbegMAT(1) = XCbegMAT(1)-1.0! Extra rotation if bMod not set call AdjustJDCar(XCbegMAT(1), nCar, JDCar, NCoff) !if (.not. bMod) XCbegMAT(1) = XCbegMAT(1)+1.0 XCbegMAT(1) = XCbegMAT(1)+0.5 !----------- ! Now set up the final array limits and region of interest XCbegROI(1) = XCbegMAT(1)-0.5 ! Region of interest XCendROI(1) = XCbegMAT(1)+0.5 if (bMod) then !------- ! If bMod is set then the array covers the same range as the region of interest ! (exactly one rotation centered on Carrington position of Earth). XCbegMAT(1) = XCbegROI(1) ! Array exactly covers region of interest XCendMAT(1) = XCendROI(1) XCtst1 = XCbegMAT(1)-XCmargin ! Search limits XCtst2 = XCendMAT(1)+XCmargin else !------- ! If bMod is NOT set then the region of interest is extended XCbegMAT(1) = XCbegROI(1)-1 ! Array limits XCendMAT(1) = XCendROI(1) XCtst1 = XCbegMAT(1) ! Search limits XCtst2 = XCendMAT(1) end if else ! Normal mode !------- ! Calculate range of Carrington variables to work with: [XClo,XChi] ! XClo is based on the first data file available (MJDfrst). ! XChi is based on the current time. call Julian(11,iYr,Doy,dble(MJDfrst),JDtmp) XClo = XMAP_SC_POS(EARTH,iYr,Doy,nCar,JDCar)! Earliest XC value (matches MJDfrst) XClo = XClo+.5 ! Add a safety margin (still not foolproof!!) call Local2UT(iOffUT,iYr,Doy) ! Current time XChi = max(XMAP_SC_POS(EARTH,iYr,Doy,nCar,JDCar)-1.,XClo) write (cStr,'(A,F7.2,A,F7.2,A)') '$',NCoff+XClo,'$',NCoff+XChi,'$0$' !------- ! The user input is a full Carrington variable, i.e. including NCoff XCbegMAT(1) = NCoff+XClo ! max(XClo,XCbeg) call AskR4('Start Carrington variable'//cStr,XCbegMAT(1)) XCbegMAT(1) = XCbegMAT(1)-NCoff !------- ! Recalculate JDCar array and NCoff based on selected Carrington rotation XCbeg ! (we want all XC* values to be as small as possible to retain as much precision as possible). call AdjustJDCar(XCbegMAT(1), nCar, JDCar, NCoff) XCendMAT(1) = XCbegMAT(1)+1 if (bMod) then dXC = 1 call AskR4('# Rotations averaged',dXC) dXC = max(1.,min(dXC,1.+int(XChi-XCbegMAT(1)))) ! Stay within available range else XCendMAT(1) = NCoff+XCendMAT(1) call AskR4('End Carrington variable'//cStr,XCendMAT(1)) XCendMAT(1) = XCendMAT(1)-NCoff end if !------- XCbegROI(1) = XCbegMAT(1) ! Region of interest XCendROI(1) = XCendMAT(1) if (bMod) then dXC = (dXC-1)/2+XCmargin ! Array exactly covers region of interest XCtst1 = XCbegMAT(1)-dXC ! Search limits XCtst2 = XCendMAT(1)+dXC else XCbegMAT(1) = XCbegROI(1)-1 ! Array limits XCendMAT(1) = XCendROI(1)+1 XCtst1 = XCbegMAT(1) ! Search limits XCtst2 = XCendMAT(1) end if ! Start MJD for data search MJDref = FLINT8(1,nCar,JDCar,dble(XCtst2),Tiny)-SUN__MJDtoJD end if TT = 0.5*(XCbegROI(1)+XCendROI(1)) ! Set time to center of ROI dTT = 0.0 TTNow = TT !------- ! Update nLng: needed when more than one rotation is reconstructed ! i.e. for the quasi-timedependent (nomod-360) tomography. nLng = nint((XCendMAT(1)-XCbegMAT(1))*(nLng-1))+1 call T3D_iset(T3D__NLNG,0,nLng) else ! Time dependent call Julian(11,iYr,Doy,dble(MJDfrst),JDtmp) XClo = XMAP_SC_POS(EARTH,iYr,Doy,nCar,JDCar)! Earliest XC value (matches MJDfrst) XClo = XClo+.5 ! Add a safety margin (still not foolproof!!) call Local2UT(iOffUT,iYr,Doy) ! Current time XChi = max(XMAP_SC_POS(EARTH,iYr,Doy,nCar,JDCar)-1.,XClo) write (cStr,'(A,F7.2,A,F7.2,A)') '$',NCoff+XClo,'$',NCoff+XChi,'$0$' !------ ! Specify the time range of the reconstruction as a start and end time in terms ! of a Carrington variable. TTbeg = NCoff+XClo call AskR4('Start Carrington time'//cStr,TTbeg) TTbeg = TTbeg-NCoff call AdjustJDCar(TTbeg, nCar, JDCar, NCoff) write (cStr,'(A,F7.2,A,F7.2,A)') '$',NCoff+TTbeg,'$',NCoff+XChi,'$0$' TTend = NCoff+TTbeg+1 call AskR4('End Carrington time'//cStr,TTend) TTend = TTend-NCoff TT = TTbeg dTT = (TTend-TTbeg)/(nTim-1) ! Time step in fraction of rotation TTNow = TTbeg !------- ! For each time the array limits and region of interest are set to 1 rotation ! bracketing the time. do L=1,nTim XCbegROI(L) = TTtime(L)-0.5 XCendROI(L) = TTtime(L)+0.5 XCbegMAT(L) = XCbegROI(L) XCendMAT(L) = XCendROI(L) end do end if call T3D_iset(T3D__NCOFF,0,NCoff) call T3D_set (T3D__TT ,0, TT) call T3D_set (T3D__DTT ,0,dTT) call T3D_iset(T3D__ITIME,0,1 ) call T3D_set (T3D__TIME ,0,TTtime(1)) call T3D_set (T3D__TNOW ,0,TTNow) call T3D_set (T3D__XCMAT ,0,XCbegMAT(1)) call T3D_set (T3D__XCMAT+1,0,XCendMAT(1)) call T3D_set (T3D__XCROI ,0,XCbegROI(1)) call T3D_set (T3D__XCROI+1,0,XCendROI(1)) !------- Begin: Info only: start time of Carrington rotation call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCbegROI(1)),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(/,1X,A,F7.2,A,I2,3A,I4,A,I3,A)') 'ROI start: Carrington variable ',NCoff+XCbegROI(1), & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCendROI(1)),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(1X,A,F7.2,A,I2,3A,I4,A,I3,A)') ' ROI end: Carrington variable ',NCoff+XCendROI(1), & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCbegMAT(1)),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(/,1X,A,F7.2,A,I2,3A,I4,A,I3,A)') 'Array start: Carrington variable ',NCoff+XCbegMAT(1), & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCendMAT(1)),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(1X,A,F7.2,A,I2,3A,I4,A,I3,A)') ' Array end: Carrington variable ',NCoff+XCendMAT(1), & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCtst1),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(/,1X,A,F7.2,A,I2,3A,I4,A,I3,A)') 'Data start: Carrington variable ',NCoff+XCtst1, & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' call Julian(1,iYr,Doy, FLINT8(1,nCar,JDCar,dble(XCtst2),Tiny) ,JDtmp) iDoy = Doy call DATE_DOY(1,iYr,cMon,iMon,iDay,iDoy) write (*,'(1X,A,F7.2,A,I2,3A,I4,A,I3,A,/)') ' Data end: Carrington variable ',NCoff+XCtst2, & ' on date ',iDay,'-',cMon,'-',iYr,' ( Doy ',iDoy,' )' !------- End: Info only return end