FUNCTION alloc_pd_vars (nrot_yrs, nperiods) USE pd_var_type_def USE pd_dates_vars USE pd_update_vars USE pd_report_vars USE pd_var_tables IMPLICIT NONE INTEGER :: alloc_pd_vars ! Allocate status return INTEGER, INTENT (IN) :: nrot_yrs ! Number of rotation years INTEGER, INTENT (IN) :: nperiods ! Number of total periods INTRINSIC ASSOCIATED ! use to verify status of pointers INTEGER :: i, j, m, y ! Local loop variables INTEGER :: alloc_status = 0 ! Local allocate status return INTEGER :: ret_status = 0 ! Local allocate status return alloc_pd_vars = 0 ! Init return value to zero ! Allocate for "update" variables ALLOCATE (yrly_update(Max_yrly_vars), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating yrly_update(Max_yrly_vars)" ret_status = ret_status + alloc_status END IF ALLOCATE (monthly_update(Max_monthly_vars), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating monthly_update(Max_monthly_vars)" ret_status = ret_status + alloc_status END IF ALLOCATE (hmonth_update(Max_hmonth_vars), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating hmonth_update(Max_hmonth_vars)" ret_status = ret_status + alloc_status END IF ALLOCATE (period_update(Min_period_vars:Max_period_vars), & STAT = alloc_status) IF (alloc_status /= 0) THEN print *, & "Error allocating period_update(Min_period_vars:Max_period_vars)" ret_status = ret_status + alloc_status END IF ! Allocate for all "report" variables ALLOCATE (yrly_report(Max_yrly_vars,0:nrot_yrs), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating yrly_report(Max_yrly_vars,0:nrot_yrs)" ret_status = ret_status + alloc_status END IF ALLOCATE (monthly_report(Max_monthly_vars,1:12,0:nrot_yrs), & STAT = alloc_status) IF (alloc_status /= 0) THEN print *, & "Error allocating monthly_report(Max_monthly_vars,1:12,0:nrot_yrs)" ret_status = ret_status + alloc_status END IF ALLOCATE (hmonth_report(Max_hmonth_vars,1:nrot_yrs*24), & STAT = alloc_status) IF (alloc_status /= 0) THEN print *, & "Error allocating hmonth_report(Max_hmonth_vars,1:nrot_yrs*24)" ret_status = ret_status + alloc_status END IF ALLOCATE (period_report(Min_period_vars:Max_period_vars,1:nperiods), & STAT = alloc_status) IF (alloc_status /= 0) THEN print *, & "Error allocating period_report(Min_period_vars:Max_period_vars,1:nperiods)" ret_status = ret_status + alloc_status END IF ! Allocate for reporting period dates ALLOCATE (yrly_dates(0:nrot_yrs), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating yrly_dates(0:nrot_yrs)" ret_status = ret_status + alloc_status END IF ALLOCATE (monthly_dates(1:12,0:nrot_yrs), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating monthly_dates(,1:12,0:nrot_yrs)" ret_status = ret_status + alloc_status END IF ALLOCATE (hmonth_dates(1:nrot_yrs*24), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating hmonth_dates(1:nrot_yrs*24)" ret_status = ret_status + alloc_status END IF ALLOCATE (period_dates(1:nperiods), STAT = alloc_status) IF (alloc_status /= 0) THEN print *, "Error allocating period_dates(1:nperiods)" ret_status = ret_status + alloc_status END IF ! Associate "dates" pointers in "report" variable structures do i=1, Max_yrly_vars do y=0, nrot_yrs yrly_report(i,y)%date => yrly_dates(y) end do do m=1, 12 !for each month do y=0, nrot_yrs monthly_report(i,m,y)%date => monthly_dates(m,y) end do end do end do do i=1, Max_hmonth_vars do j=1, nrot_yrs*24 hmonth_report(i,j)%date => hmonth_dates(j) end do end do do i=Min_period_vars, Max_period_vars do j=1, nperiods period_report(i,j)%date => period_dates(j) end do end do ! print *, "Max_yrly_vars: ", Max_yrly_vars ! do y=0, nrot_yrs ! IF (ASSOCIATED (yrly_report(Wind_energy,y)%date)) THEN ! print *, "alloc: %date is associated" ! ELSE ! print *, "alloc: %date is NOT associated" ! END IF ! print *, "alloc: ", yrly_report(Wind_energy,y)%date ! end do ! Associate "pd_dates" pointers in "pd_update" structures ! (initially point to first "pd_report_dates" for each var) DO i=1, Max_yrly_vars yrly_update(i)%date => yrly_dates(0) ! Use yrly dates monthly_update(i)%date => monthly_dates(1,0) ! 1st mon of 1st yr dates END DO DO i=1, Max_hmonth_vars hmonth_update(i)%date => hmonth_dates(1) ! 1st half month period END DO DO i=Min_period_vars, Max_period_vars period_update(i)%date => period_dates(1) ! 1st period of rotation END DO alloc_pd_vars = ret_status END FUNCTION alloc_pd_vars