SUBROUTINE TYPE998(TIME,XIN,OUT,T,DTDT,PAR,INFO,ICNTRL,*) !----------------------------------------------------------------------------------------------------------------------- ! This subroutine demonstrates the proper technique for using the Differental_Eqn subroutine to solve ! a linear differential equation in TRNSYS 16. ! ! Copyright © 2006 Thermal Energy System Specialists, LLC. All rights reserved. !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- USE TrnsysConstants USE TrnsysFunctions !----------------------------------------------------------------------------------------------------------------------- !DEC$ATTRIBUTES DLLEXPORT :: TYPE998 !----------------------------------------------------------------------------------------------------------------------- !TRNSYS Declarations IMPLICIT NONE DOUBLE PRECISION XIN,OUT,TIME,PAR,T,DTDT,TIME0,TFINAL,DELT,STORED INTEGER*4 INFO(15),NP,NI,NOUT,ND,IUNIT,ITYPE,ICNTRL,NSTORED CHARACTER*3 YCHECK,OCHECK !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !User Declarations PARAMETER (NP=4,NI=1,NOUT=2,ND=0,NSTORED=2) !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Required TRNSYS Dimensions DIMENSION XIN(NI),OUT(NOUT),PAR(NP),YCHECK(NI),OCHECK(NOUT),T(ND),DTDT(ND),STORED(NSTORED) !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Declarations & Definitions for the User Variables DOUBLE PRECISION T_init,T_final,T_average,T_start,hs,mass,cp,T_2,a,b,Q_out CHARACTER (LEN=maxMessageLength) MESSAGE1 !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Error Messages MESSAGE1='Fill in this error message and use a call to "Messages" wherever you need to reprt an error.' !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Get Global TRNSYS Simulation Variables TIME0=getSimulationStartTime() TFINAL=getSimulationStopTime() DELT=getSimulationTimeStep() !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Set the Version Information IF(INFO(7).EQ.-2) THEN INFO(12)=16 RETURN 1 ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Do All of the Very Last Call Manipulations Here IF (INFO(8).EQ.-1) THEN RETURN 1 ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Do All of the After-Convergence Manipulations Here IF(INFO(13).GT.0) THEN ! Get the values from storage CALL getStorageVars(STORED,NSTORED,INFO) IF(ErrorFound()) RETURN 1 ! Update the stored values (reset the initial temperature to the final temperature from the converged timestep) STORED(2)=STORED(1) ! Set the new values in storage CALL SetStorageVars(STORED,NSTORED,INFO) RETURN 1 ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Do All of the First Call Manipulations Here IF (INFO(7).EQ.-1) THEN ! Get the Unit Number and Type Number IUNIT=INFO(1) ITYPE=INFO(2) ! Set the INFO Array Variables to Tell TRNSYS How This Type Should Work INFO(6)=NOUT INFO(9)=1 INFO(10)=0 ! Call the TYPECK Subroutine to Compare What This Component Wants to What is Supplied in the Input File CALL TYPECK(1,INFO,NI,NP,ND) ! Set the Variable Types for the Inputs and the Outputs DATA YCHECK/'TE1'/ DATA OCHECK/'TE1','PW1'/ CALL RCHECK(INFO,YCHECK,OCHECK) ! Set the Size of the Storage Array CALL setStorageSize(NSTORED,INFO) ! Return to the TRNSYS Engine RETURN 1 ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !DO ALL OF THE INITIAL TIMESTEP MANIPULATIONS HERE - THERE ARE NO ITERATIONS AT THE INTIAL TIME IF (TIME.LT.(TIME0+DELT/2.D0)) THEN ! Get the Unit Number and Type Number IUNIT=INFO(1) ITYPE=INFO(2) ! Read in the Values of the Parameters Mass=PAR(1) hs=PAR(2) Cp=PAR(3) T_start=PAR(4) ! Check the Parameters for Problems IF(Mass<=0.) CALL TYPECK(-4,INFO,0,1,0) IF(hs<=0.) CALL TYPECK(-4,INFO,0,2,0) IF(Cp<=0.) CALL TYPECK(-4,INFO,0,3,0) IF(ErrorFound()) RETURN 1 ! Set the initial values of the Outputs OUT(1)=T_start OUT(2)=0. ! Set the initial storage variables STORED(1)=T_start STORED(2)=T_start CALL setStorageVars(STORED,NSTORED,INFO) ! Return to the TRNSYS Engine RETURN 1 ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- ! *** ITS AN ITERATIVE CALL TO THIS COMPONENT *** !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Reread the Parameters If Another Unit of this Type Has Been Called IF(INFO(1).NE.IUNIT) THEN ! Get the Unit Number and Type Number IUNIT=INFO(1) ITYPE=INFO(2) ! Read in the Values of the Parameters Mass=PAR(1) hs=PAR(2) Cp=PAR(3) T_start=PAR(4) ENDIF !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Get the Values of the Inputs to the Model at the Current Iteration T_2=XIN(1) !Driving force temperature [C] !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Check the Inputs for Problems If(DABS(T_2)>1.D+10) CALL TYPECK(-3,INFO,1,0,0) If(ErrorFound()) RETURN 1 !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Retrieve the Values from Storage CALL getStorageVars(STORED,NSTORED,INFO) IF(ErrorFound()) RETURN 1 T_init=STORED(2) !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Perform all of the iterative call calculations here. !Set up the differential equation in the form dT/dt = aT + b from: mass * Cp * dT/dt = - hs * (T-T_2) a=-hs/mass/Cp b=hs/mass/Cp*T_2 !Call the differential equation solver CALL Differential_Eqn(TIME,a,b,T_init,T_final,T_average) !Solve for the energy lost from the mass Q_out=hs*(T_average-T_2) !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Set the Temporary Values in Storage STORED(1)=T_final CALL SetStorageVars(STORED,NSTORED,INFO) !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Set the Outputs from the Model Out(1)=T_average Out(2)=Q_out !----------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------- !Everything is Done at this Iteration, Return to the Engine RETURN 1 END !-----------------------------------------------------------------------------------------------------------------------