/* Submodel PNOR001 skeleton created by AME Submodel editing utility lun. 10. juil. 17:22:57 2017 */ #include #include #include #include "ameutils.h" /* ******************************************************************************* TITLE : PNOR001 ------------------------------------------------------------------------------ DATE OF CREATION / AUTHOR : 2002 : Created by FS from PNOR01 ------------------------------------------------------------------------------ SOURCE : This material contains trade secrets or otherwise confidential information owned by Siemens Industry Software Inc. or its affiliates (collectively, "Siemens"), or its licensors. Access to and use of this information is strictly limited as set forth in the Customer's applicable agreements with Siemens. Unpublished work. Copyright 2023 Siemens ******************************************************************************* */ #define _SUBMODELNAME_ "PNOR001" /* >>>>>>>>>>>>Insert Private Code Here. */ /* real stores */ #define PATM 0 #define AREA 1 #define CQ 2 /* integer stores */ #define DISC_ORIF 0 /* <<<<<<<<<<< m**2] Cv flow coefficient (Cv) [null] Kv flow coefficient (Kv) [null] */ /* There are 2 integer parameters: gi gas type index flowset flow coefficient setting */ void pnor001in_(int *n, double rp[4], int ip[2], double c[3] , int ic[1]) { int loop, error; /* >>>>>>>>>>>>Extra Initialization Function Declarations Here. */ /* <<<<<<<<<<<>>>>>>>>>>>Initialization Function Check Statements. */ pn2_valid_gas_(&gi, &error); if (flowset == 1) { if (area < 0.0) { error = 2; amefprintf(stderr, "\nOrifice area should be positive.\n"); } if (cq <= 0.0) { error = 2; amefprintf(stderr, "\nFlow coefficient should be strictly positive.\n"); } } else if (flowset == 2) { if (Cv < 0.0) { error = 2; amefprintf(stderr, "\nFlow coefficient (Cv) should be positive (value is %g).\n", Cv); } } else { if (Kv < 0.0) { error = 2; amefprintf(stderr, "\nFlow coefficient (Kv) should be positive (value is %g).\n", Kv); } } /* <<<<<<<<<<< 99) { amefprintf(stderr, "\ngas type index must be in range [1..99].\n"); error = 2; } if (flowset < 1 || flowset > 3) { amefprintf(stderr, "\nflow coefficient setting must be in range [1..3].\n"); error = 2; } SUBMODEL_HANDLE_AND_RESET_ERROR(_SUBMODELNAME_, n, error) /* Common -> SI units conversions. */ rp[1] *= 1.00000000000000e-006; area = rp[1]; /* >>>>>>>>>>>>Initialization Function Executable Statements. */ /* get atmospheric pressure */ c[PATM] = pn2getatp_(); if (flowset == 1) { c[CQ] = cq; c[AREA] = area; } else { /* calculation of equivalent area with Cv or Kv. Default value of cq; the same value will be used in pn2rcqfix. */ c[CQ] = 0.72; if (flowset == 2) /* Cv */ orif_areafromcv_(&Cv, &c[CQ], &c[AREA]); else orif_areafromkv_(&Kv, &c[CQ], &c[AREA]); } /* <<<<<<<<<<< W] basic variable output 2 dm1 mass flow rate at port 1 [g/s -> kg/s] basic variable output 3 temp1 temperature at port 1 [K] basic variable input 4 press1 pressure at port 1 [Pa] basic variable input Port 2 has 4 variables: 1 dh2 duplicate of dh1 (sign reversed) 2 dm2 duplicate of dm1 (sign reversed) 3 temp2 temperature at port 2 [K] basic variable input 4 press2 pressure at port 2 [Pa] basic variable input */ /* There are 2 internal variables. 1 cm mass flow parameter (cm) [(kg*K/J)**(1/2)] basic variable 2 gasvel vena contracta gas velocity [m/s] basic variable */ void pnor001_(int *n, double *dh1, double *dm1, double *temp1 , double *press1, double *temp2, double *press2, double *cm , double *gasvel, double rp[4], int ip[2], double c[3] , int ic[1]) { int loop; /* >>>>>>>>>>>>Extra Calculation Function Declarations Here. */ double pressa1, pressa2; /* <<<<<<<<<<<>>>>>>>>>>>Calculation Function Executable Statements. */ /* set absolute pressures */ pressa1 = *press1 + c[PATM]; pressa2 = *press2 + c[PATM]; /* calculation of the flows */ pn2rcqfix_( dh1, dm1, temp1, &pressa1, temp2, &pressa2, &c[AREA], &c[CQ], &gi, cm, gasvel, &ic[DISC_ORIF]); /* <<<<<<<<<<< Common units conversions. */ *dm1 /= 1.00000000000000e-003; }