- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear all,
I have three modules which returns three variables through a DLL. The variable's names are: reyOleo, fatAtrito and perdaCarga. Running it in a Main file called Principal, the results are OK! But when I call it from a C# TextBox, the variable reyOleo is OK, but fatAtrito and perdaCarga are equal to NaN (Not a number). I'm attatching all the files to help.
It's worthnoting that fatAtrito and perdaCarga modules depends on reyOleo value. I really don't know whats is happening. Can some one save me?
!====================================================================
module Reynolds implicit none ! Declaração global para leitura nos demais módulos. double precision :: vazaoOleo, diametroTubo, massaEspecOleo, viscOleo, reyOleo contains subroutine Reynol(vazaoOleo, diametroTubo, massaEspecOleo, viscOleo, reyOleo) ! ! Descrição: ! Essa sub-rotina calcula número de Reynolds. ! Variáveis de entrada: ! vazaoOleo = Vazão do Óleo (m3/d) ! diametroTubo = Diâmetro interno da tubulação (in) ! massaEspecOleo = Massa específica do óleo (kg/m3) ! viscOleo = Viscosidade do óleo (cP) ! areaTubo = Área da secção transversal do tubo (in2) ! Variável de saída: ! ReyOleo = Número de Reynolds do óleo !Exportando a DLL: !DEC$ ATTRIBUTES DLLEXPORT :: Reynol ! Declarando as variáveis com dupla precisão. double precision, intent(in) :: vazaoOleo, diametroTubo, massaEspecOleo, viscOleo double precision, intent(out) :: reyOleo !Declarando a variável "Dummy". double precision areaTubo !Declarando o número "pi" como parâmetro. parameter pi = 3.1415927d0 !Realizando o cálculo da área em (in2). areaTubo = (pi * diametroTubo **2) / 4 ! Calculando o número de Reynolds. ! (39370.1/86400) é um fator de conversão, haja vista a diferença no sistemas ! de unidades exibidos acima. reyOleo = (39370.1/86400) * (vazaoOleo * diametroTubo * massaEspecOleo / (viscOleo * areaTubo)) end subroutine end module !==================================================================== module Fatrito ! Chamando os módulos que calcula Reynolds. use Reynolds implicit none ! Declaração global para leitura nos demais módulos. double precision :: rugoTubo, fatAtrito contains subroutine Fatfan(rugoTubo, fatAtrito) ! ! Descrição: ! Essa sub-rotina calcula o fator de atrito de Fanning. ! Variáveis de entrada: ! rugoTubo = Rugosidade da tubulação (m) ! diametroTudo = Diâmetro interno da tubulação (in) ! Variável de saída: ! fatAtrito = Fator de Atrito de Fanning !Exportando a DLL: !DEC$ ATTRIBUTES DLLEXPORT :: Fatfan ! Declarando as variáveis com dupla precisão. double precision, intent(in) :: rugoTubo double precision, intent(out) :: fatAtrito ! Declarando os "Dummy Arguments" ou "argumentos burros". double precision :: A1 double precision :: A2 ! Chamando a subrotina que calcula o número de Reynolds. call Reynol(vazaoOleo, diametroTubo, massaEspecOleo, viscOleo, reyOleo) if (reyOleo < 2100d0) then ! Cálculo do Fator de atrito caso o regime seja laminar. fatAtrito = 16d0 / reyOleo else if (reyOleo > 4000d0) then ! Utilizando a equação de & Zigrand e Sylvester (1982) para região turbulenta: A1 = rugoTubo / (3.7 * diametroTubo) + 13 / reyOleo A2 = rugoTubo / (3.7 * diametroTubo) - (5.02 / reyOleo) * log10(A1) fatAtrito = 1 / (-2 * log10(rugoTubo / (3.7 * diametroTubo) - (5.02 / reyOleo) * log(A2))) **2 else fatAtrito = (1 / 1.8 * log10(reyOleo / (0.135 * (rugoTubo / diametroTubo) + 6.5))) **2 end if end if end subroutine end module
!====================================================================
module QuedaPressao ! Chamando os módulos que calcula Reynolds e o fator de atrito. use Reynolds use Fatrito implicit none ! Declaração global para leitura nos demais módulos double precision :: compTubo, perdaCarga contains subroutine Quedap(compTubo, perdaCarga) ! Descrição: ! Essa sub-rotina calcula a perda de carga para um escoamento de um fluido newtoniano ! em uma tubulação. ! Variáveis de entrada: ! vazaoOleo = Vazão do Óleo (m3/d) ! diametroTubo = Diâmetro interno da tubulação (in) ! compTubo = Comprimento da tubulação (m) ! massaEspecOleo = Massa específica do óleo (kg/m3) ! fatAtrito = Fator de Atrito de Fanning ! g = Aceleração da gravidade (m/s2) ! Variável de saída: ! deltaP = Perda de Carga (kgf/cm2) !Exportando a DLL: !DEC$ ATTRIBUTES DLLEXPORT :: Quedap ! Declarando as variáveis com dupla precisão. double precision, intent(in) :: compTubo double precision, intent(out) :: perdaCarga ! Declarando os "Dummy Arguments" ou "argumentos burros". double precision g ! Chamando a sub-rotina que calcula o fator de atrito de Fanning. call Reynol(vazaoOleo, diametroTubo, massaEspecOleo, viscOleo, reyOleo) call Fatfan(rugoTubo, fatAtrito) ! A aceleração da gravidade por ser declarada aqui. g = 9.81 ! Calculando a Perda de Carga para uma tubulação vertical ou horizontal. ! 0.1143 é um fator para recber as unidades mostradas acima. ! 98066,5 é um fator de conversão de mcl para kgf/cm2. perdaCarga = ((0.1143 * massaEspecOleo * g) * fatAtrito * (compTubo / diametroTubo **5) * (1 / g) * (8 * vazaoOleo **2)) / 98066.5 end subroutine end module
!====================================================================
public partial class ReynoldsForm : Form { // Comando para importar a DLL do FORTRAN. [DllImport("Escoa_H2S_DLL", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl, EntryPoint = "REYNOLDS_mp_REYNOL")] public static extern void REYNOL([In] ref double _vazaoOleo, [In] ref double _diametroTubo, [In] ref double _massaEspecOleo, [In] ref double _viscOleo, [In, Out] ref double _reyOleo); // Comando para importar a DLL do FORTRAN. [DllImport("Escoa_H2S_DLL", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl, EntryPoint = "FATRITO_mp_FATFAN")] public static extern void FATFAN([In] ref double _rugoTubo, [In, Out] ref double _fatAtrito); // Comando para importar a DLL do FORTRAN. [DllImport("Escoa_H2S_DLL", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl, EntryPoint = "QUEDAPRESSAO_mp_QUEDAP")] public static extern void QUEDAP([In] ref double _compTubo, [In, Out] ref double _perdaCarga); public ReynoldsForm() { InitializeComponent(); } // Declando as variáveis: double _vazaoOleo, _diametroTubo, _massaEspecOleo, _viscOleo, _reyOleo, _compTubo, _perdaCarga, _rugoTubo, _fatAtrito; string reyOleoString, fatAtritoString, perdaCargaString; private void calculaReynoldsbutton_Click(object sender, EventArgs e) { // Entrando com os dados brutalmente. Depois vou chamar pelo array de entrada. // Isso é apenas para fins de teste. _vazaoOleo = 54.28672;//4000; // m3/d _diametroTubo = 0.15740; //6; // inch _massaEspecOleo = 1.23; //880; // kg/m3 _viscOleo = 0.0179; //1.85; // cP _compTubo = 0.1; //m _rugoTubo = 4.5e-5; // Chamando a DLL do Fortran: REYNOL(ref _vazaoOleo, ref _diametroTubo, ref _massaEspecOleo, ref _viscOleo, ref _reyOleo); // Chamando a DLL do Fortran: FATFAN(ref _rugoTubo, ref _fatAtrito); // Chamando a DLL do Fortran: QUEDAP(ref _compTubo, ref _perdaCarga); // Passando para string o valor de Reynolds que vem da DLL e armazenando em reyOleoString. reyOleoString = Convert.ToString(_reyOleo); // Passando para string o valor do fator de atrito que vem da DLL e armazenando em fatAtritoString. fatAtritoString = Convert.ToString(_fatAtrito); // Passando para string o valor da perda de carga que vem da DLL e armazenando em perdaCargaString. perdaCargaString = Convert.ToString(_perdaCarga); // Exibindo o resultado na TextBox. reynoldsTextBox.Text = reyOleoString; // Exibindo o resultado na TextBox. fatordeAtritotextBox.Text = fatAtritoString; // Exibindo o resultado na TextBox. quedaPressaotextBox.Text = perdaCargaString; } // Fim do método de clique calculaReynoldsbutton_Click
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
See https://software.intel.com/en-us/forums/topic/534579

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page