[TRNSYS-users] problem between GetStorageVars and type65d
Sergio.Pintaldi at csiro.au
Sergio.Pintaldi at csiro.au
Thu Oct 16 20:40:45 PDT 2014
Dear TRNSYS users,
I have a problem, when I try to use the storage array in TRNSYS using the specific funcions (setstoragesize , getstoragevars, setstoragevars). I created a new type and use the type65d to see the results while the simulation is running. The main problem is that the type on itself works properly without any error, but as soon as I link their outputs to the input of the online plotter, I obtained a "invalid floating point operation" error at the initial timestep, forcing the simulation to stop. Also if the two types are not linked, it give me the error. Only if I set the number of right and left axis variables both to 0, the simulation runs properly.
This error has been encountered by others too (e.g. http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/2013-April/011470.html , http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/2012-February/009376.html , http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/2010-July/006481.html ).
TRNSYS version: 17 OS: Windows 7 64bit, the type is compiled as .cpp with Microsoft Visual Studio Express 2012 and linked as .dll
TRNSYS.h has been modified to include the storage functions:
extern "C" __declspec(dllimport) double _cdecl SETSTORAGESIZE(int* NSTORE,int info[]);
extern "C" __declspec(dllimport) double _cdecl SETSTORAGEVARS(double* STORE_IN,int* NSTORE,int info[]);
extern "C" __declspec(dllimport) double _cdecl GETSTORAGEVARS(double* STORE_OUT,int* NSTORE,int info[]);
#define SetStorageSize SETSTORAGESIZE
#define SetStorageVars SETSTORAGEVARS
#define GetStorageVars GETSTORAGEVARS
Below there is a description of my type:
In order to make it simple I created a simplified version that takes as input one temperature, as parameters the number of nodes of the tube and the shell and the initial temperaure, and produces 4 outputs, outlet tube temperture and 3 temperatures in the shell. The role of the type is to increase the temperatures of the tube and the shell by 1, every timestep. The heat exchanger is modelled as vary layers (like a storage tank), set by the heat transferfluid (htf) nodes.
The purpose of the type is to simulate a shell and tube heat exchanger, thus I need to store the "old" values at the very end of the timestep into the storage arrays, and retrieve them every call of the type. In order to simplify the problem let's assume a single tube in a shell.
In order to understand the general idea, I should say that I need to use the dynamic allocation in order to create the arrays based on the number of nodes, defined by the user, in the parameters. Once the user sets as parameters the nodes along the tubes direction (nodes_htf) and along the radial direction in the shell (nodes_shell), a vector for the tube temperatures and a matrix (nodes_htf x nodes_shell) for the shell temperatures should be created.
I implemented the following steps, compiling each time and check the simulation run in trnsys:
1. I set up the dimension of the storage array in the section "very first call of the simulation" (it works perfectly but of course the type does do anything)
int store_size = nodes_htf*(nodes_shell+1); //set the storage size to store Nhtf + Nhtf * Nshell temperatures
SetStorageSize(&store_size,info);
2. I set up the initial values of the outputs and store them in the section "do all the initial timestep manipulations" (it works perfectly but of course the type does do anything)
int store_size = nodes_htf*(nodes_shell+1);
stored = new double[store_size];
for(int i=0;i<store_size;i++)
{
stored[i]=Tini;
}
SetStorageVars(stored,&store_size,info);
delete[] stored;
3. I retrieve the storage values on before make chenge to them, section "Retrieve the values in the storage array for this iteration" (if I use the type alonein the deck it works perfectly, but as soon as I introduce the type65 it gives the floating point error!!!).
int store_size = nodes_htf*(nodes_shell+1);
stored = new double[store_size];
GetStorageVars(stored,&store_size,info);
delete[] stored;
The files are attached:
- Type205 cpp
- Project6: deck with type alone
- Project7: deck with type205 + type65
Thank you for the help. In you need to understand the purpose, you can read the next steps here below (which are commented in the type205 code):
4. I save the storage values in the "old" arrays for the htf and the shell
Thtf_old = new double [nodes_htf];
Tshell_old = new double *[nodes_htf];
for (int i=0;i<nodes_htf;i++){Tshell_old[i]=new double[nodes_shell];}
//assign the storage values to the old array
for (int i=0;i<nodes_htf;i++)
{
Thtf_old[i] = stored[i*(nodes_shell+1)];// the values are supposed to be stored per layer so the first value is for the HTF and the others are for the shell
for (int j=1;j<nodes_shell+1;j++)
{
Tshell_old[i][j-1] = stored[i*(nodes_shell+1)+j];
}
}
delete[] stored;
5. I create the new values arrays at the first iteration for the current timestep (info[6] = 0, otherwise if every I create them every call I allocate too much memory), and calculate the new values from the old ones and set the outputs
if (info[6] == 0)
{
Thtf = new double[nodes_htf];
Tshell = new double *[nodes_htf];
for (int i=0;i<nodes_htf;i++){Tshell[i] = new double[nodes_shell];}
}
for (int i=0;i<nodes_htf;i++)
{
Thtf[i] = Thtf_old[i] + 1.0;
for (int j=0;j<nodes_shell;j++)
{
Tshell[i][j] = Tshell_old[i][j] + 1.0;
}
}
delete[] Thtf_old;
for (int i=0;i<nodes_htf;i++){delete[] Tshell_old[i];}
delete[] Tshell_old;
//Set the outputs
Tout = Thtf[nodes_htf-1];
Tshell_top = Tshell[0][nodes_shell-1];
Tshell_mid = Tshell[int(floor(nodes_htf/2.0))-1][nodes_shell-1];
Tshell_bot = Tshell[nodes_htf-1][nodes_shell-1];
6. I save the new values in the trnsys storage array in the after iteration section in oder to make them available for the next time step iterations. I should save in that section otherwise every call the type would retrieve the wrong values.
int store_size = nodes_htf*(nodes_shell+1);
stored = new double[store_size];
for (int i = 0; i < nodes_htf; i++)
{
stored[i*(nodes_shell+1)] = Thtf[i];
for (int j=1;j<nodes_shell+1;j++)
{
stored[i*(nodes_shell+1)+j] = Tshell[i][j-1];
}
}
delete[] Thtf;
for(int i=0;i<nodes_htf;i++){delete[] Tshell[i];}
delete[] Tshell;
SetStorageVars(stored,&store_size,info);
delete[] stored;
Thank you very much for the help! :)
Sergio Pintaldi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/attachments/20141017/53d7cf9d/attachment-0005.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: type205.zip
Type: application/x-zip-compressed
Size: 2982261 bytes
Desc: type205.zip
URL: <http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/attachments/20141017/53d7cf9d/attachment-0015.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Project6.zip
Type: application/x-zip-compressed
Size: 13060 bytes
Desc: Project6.zip
URL: <http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/attachments/20141017/53d7cf9d/attachment-0016.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Project7.zip
Type: application/x-zip-compressed
Size: 17057 bytes
Desc: Project7.zip
URL: <http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/attachments/20141017/53d7cf9d/attachment-0017.bin>
More information about the TRNSYS-users
mailing list