faid007
Messages postés17Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention 5 janvier 2008
-
18 juil. 2007 à 02:56
faid007
Messages postés17Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention 5 janvier 2008
-
19 juil. 2007 à 01:33
Bonjour; j'ai un programme ecrit en C et je l'ai convertie en VB mais il ne donne pas les memes resultats, j'espere que qlq peux m'aider a trouver ou j'ai comis l'erreur.
Merci en avence.
Code en C:#include<stdio.h><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
#include<conio.h>
#include<math.h>
main()
{
// FINITE ELEMENT PROGRAM FOR TRANSIENT FLOW USING //RECTANGULAR ELEMENTS
// PUTS HNEW VALUES INTO HOLD ARRAY FOR NEXT TIME STEP.
for(L =1;L<= NNODE;L++) HOLD[L]=HNEW[L];
// PRINT RESULTS FOR EVERY OTHER TIME STEP.
TIME =TIME+DT;
KOUNT=KOUNT+1;
for(I=2;I<=NNODE;I=I+2) printf("%2.2f ",HOLD[I]);
printf("%d",TIME);
printf("\n");
}
getch();
}
Code en VB:
NB: pour l'affichage des resultats j'ai utilise une msflexgride nommee Grid1
'// FINITE ELEMENT PROGRAM FOR TRANSIENT FLOW USING //RECTANGULAR ELEMENTS
'// RESERVOIR EXAMPLE
Dim NS(25), NX(25), NY(25) As Double
Dim HOLD(25), HNEW(25), G(25, 25), P(25, 25), B(25), X(25), Y(25) As Double
Dim S, T As Double
Dim XSI(4) As Double
Dim ETA(4) As Double
' // BLOCK 2. CONSTRUCT CONDUCTANCE AND STORAGE MATRICES.
Dim K, J, I, N, M, KK, IQ As Integer
Dim NODE(25) As Integer
Dim AA, BB As Double
For K = 1 To NELEM
'// GENERATE NODE NUMBERS OF ELEMENTS K.
I = 2 * K
J = I + 2
M = I + 1
N = I - 1
NODE(1) = I
NODE(2) = J
NODE(3) = M
NODE(4) = N
'AA = (X(J) - X(I)) / 2
'BB = (Y(N) - Y(I)) / 2
AA = 5
BB = 5
'MsgBox (AA)
'MsgBox (BB)
For KK = 1 To 4
L = NODE(KK)
'// GAUSSIAN QUADRATURE.
For IQ = 0 To 3
'// NS ARE INTERPOLATION FUNCTIONS. NX AND NY ARE SPATIAL DERIVATIVES
' // BLOCK 3. STEP THROUGTH TIME .
Dim NSTEP, DT, KOUNT, KPRINT, TtIME As Single
DT = 5
KOUNT = 1
KPRINT = 2
TtIME = DT
For NSTEP = 1 To 99
'// CONSTRUCT B-MATRIX FOR EACH TIME STEP.
For L = 1 To NNODE
B(L) = 0
For JJ = 1 To NNODE
B(L) = B(L) + P(L, JJ) * HOLD(JJ) / DT
Next JJ
Next L
' // SOLVE SYSTEM OF EQUATIONS BY ITERATION.
Dim AMAX As Double
Dim OLDVAL, SUM, ERR As Double
AMAX = 0
For L = 1 To NNODE
'{
' // EXCLUSE FIXED BOUNDARY HEADS FROM ITERATION;If ((L 1) Or (L 2) Or (L = 21) Or (L = 22)) Then
L = L + 1
Else
OLDVAL = HNEW(L)
SUM = 0
For JJ = 1 To NNODE
If (JJ = L) Then
JJ = JJ + 1
Else
SUM = SUM + (G(L, JJ) + P(L, JJ) / DT) * HNEW(JJ)
End If
Next JJ
HNEW(L) = (-SUM + B(L)) / (G(L, L) + P(L, L) / DT)
ERR = Abs(OLDVAL - HNEW(L))
If (ERR > AMAX) Then AMAX = ERR
End If
Next L
' // PUTS HNEW VALUES INTO HOLD ARRAY FOR NEXT TIME STEP.
For L = 1 To NNODE
HOLD(L) = HNEW(L)
Next L
' // PRINT RESULTS FOR EVERY OTHER TIME STEP.
TtIME = TtIME + DT
KOUNT = KOUNT + 1
icol = 1
For I = 2 To NNODE Step 2
Grid1.Col = icol
Grid1.Row = NSTEP
Grid1.Text = Int(HOLD(I) * 100) / 100
icol = icol + 1
Next I
Grid1.Col = icol
Grid1.Row = NSTEP
Grid1.Text = Int(TtIME * 100) / 100
Next NSTEP
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 18 juil. 2007 à 08:47
Si j'osais je dirais... ben apprend le vb et le c deja :p
Naaan je deconne mais c'est vrai qu'il y a moulte (j'aime bien ce mot en ce moment) erreur de transcription aller hop je donne la premiere :
Quand tu fais :
Dim NS(25), NX(25), NY(25) As Double
NS() et NX() sont du type Variant et NY() en double si tu n'as pas definit de type par defaut. Ecrit toujours le type des variable cela evite de ce tromper :
Dim NS(25) As Single
Dim NX(25) As Single
Dim NY(25) As Single
A oui autre chose renseigne toi sur la correnspondance de type entre C et vb. rapidement et pour info :
Short = Integer
Int = Long
Float = Single
Double = Double
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 18 juil. 2007 à 09:34
Dim NS(25) As Single
réserve 26 flottants de l'index 0 à 25 INCLUS.
En C il n'y a pas de philo:
float NS[25], c'est bien 25 et non 26.
Comme dit EB faudra d'abord apprendre le C.
J'ajoute que ça te permettrait de bien choisir tes exemples car ceci est un code écrit avec ses mains sans intervention du moindre neurone:
NNODE n'est jamais recalculé, on mettra donc:
#define NNODE 22
La 1ere boucle:
for(L = 1; L <= NNODE; L = L+2) {
X[L] = (L-1)*5;
X[L+1] = X[L];
Y[L] = 10;
Y[L+1] = 0;
}
L n'a pas besoin de controle au 1er poassage, deviendrait donc:
float ftmp;
L = 1;
ftmp = 0.0f;
do {
X[L] = X[L+1] = ftmp;
Y[L] = 10.0f;
Y[L+1] = 0.0f;
ftmp += 10.0f
} while((L += 2) <= NNODE);
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 juil. 2007 à 09:37
clair qu'il ya a des choses sympa, dans ton code...
j'ai fait un portage bête et méchant en VB.
j'ignore si c'est conforme a tes attentes, j'ignore les resultats que tu souhaites obtenir.
ca donne ça :
Private Sub Form_Load()
'// FINITE ELEMENT PROGRAM FOR TRANSIENT FLOW USING
'//RECTANGULAR ELEMENTS
'// RESERVOIR EXAMPLE
Dim NS(1 To 4) As Single
Dim NX(1 To 4) As Single
Dim NY(1 To 4) As Single
Dim HOLD(1 To 22) As Single
Dim HNEW(1 To 22) As Single
Dim G(1 To 22, 1 To 22) As Single
Dim P(1 To 22, 1 To 22) As Single
Dim B(1 To 22) As Single
Dim X(1 To 22) As Single
Dim Y(1 To 22) As Single
Const S As Single = 0.002
Const T As Single = 0.02
Dim XSI(3) As Single
XSI(0) = -0.57735
XSI(1) = 0.57735
XSI(2) = 0.57735
XSI(3) = -0.57735
Dim ETA(3) As Single
ETA(0) = -0.57735
ETA(1) = -0.57735
ETA(2) = 0.57735
ETA(3) = 0.57735
'// BLOCK 2. CONSTRUCT CONDUCTANCE AND STORAGE MATRICES.
Dim K As Long
Dim J As Long
Dim I As Long
Dim N As Long
Dim M As Long
Dim KK As Long
Dim IQ As Long
Dim NODE(1 To 22) As Long
Dim AA As Single
Dim BB As Single
For K = 1 To NELEM
'// GENERATE NODE NUMBERS OF ELEMENTS K.
I = 2 * K
J = I + 2
M = I + 1
N = I - 1
NODE(1) = I
NODE(2) = J
NODE(3) = M
NODE(4) = N
AA = Abs(X(J) - X(I)) / 2
BB = Abs(Y(N) - Y(I)) / 2
For KK = 1 To 4
L = NODE(KK)
'// GAUSSIAN QUADRATURE.
For IQ = 0 To 3
'// NS ARE INTERPOLATION FUNCTIONS. NX AND NY ARE SPATIAL DERIVATIVES
NS(1) = 0.25 * (1 - XSI(IQ)) * (1 - ETA(IQ))
NS(2) = 0.25 * (1 + XSI(IQ)) * (1 - ETA(IQ))
NS(3) = 0.25 * (1 + XSI(IQ)) * (1 + ETA(IQ))
NS(4) = 0.25 * (1 - XSI(IQ)) * (1 + ETA(IQ))
NX(1) = -0.25 * (1 - ETA(IQ)) / AA
NX(2) = 0.25 * (1 - ETA(IQ)) / AA
NX(3) = 0.25 * (1 + ETA(IQ)) / AA
NX(4) = -0.25 * (1 + ETA(IQ)) / AA
NY(1) = -0.25 * (1 - XSI(IQ)) / BB
NY(2) = -0.25 * (1 + XSI(IQ)) / BB
NY(3) = 0.25 * (1 + XSI(IQ)) / BB
NY(4) = 0.25 * (1 - XSI(IQ)) / BB
G(L, I) = G(L, I) + (NX(1) * NX(KK) + NY(1) * NY(KK)) * AA * BB
G(L, J) = G(L, J) + (NX(2) * NX(KK) + NY(2) * NY(KK)) * AA * BB
G(L, M) = G(L, M) + (NX(3) * NX(KK) + NY(3) * NY(KK)) * AA * BB
G(L, N) = G(L, N) + (NX(4) * NX(KK) + NY(4) * NY(KK)) * AA * BB
P(L, I) = P(L, I) + NS(1) * NS(KK) * AA * BB * S / T
P(L, J) = P(L, J) + NS(2) * NS(KK) * AA * BB * S / T
P(L, M) = P(L, M) + NS(3) * NS(KK) * AA * BB * S / T
P(L, N) = P(L, N) + NS(1) * NS(KK) * AA * BB * S / T
Next IQ
Next KK
Next K
'// BLOCK 3. STEP THROUGTH TIME .
Dim NSTEP As Long
Const DT As Long = 5
Dim KOUNT As Long: KOUNT = 1
Dim TIME As Long: TIME = DT
For NSTEP = 1 To 99
'// CONSTRUCT B-MATRIX FOR EACH TIME STEP.
For L = 1 To NNODE
B(L) = 0
For JJ = 1 To NNODE
B(L) = B(L) + P(L, JJ) * HOLD(JJ) / DT
Next JJ
Next L
'// SOLVE SYSTEM OF EQUATIONS BY ITERATION.
Dim Sum As Single
For L = 1 To NNODE
'// EXCLUSE FIXED BOUNDARY HEADS FROM ITERATION
If L <> 1 And L <> 2 And L <> 21 And L <> 22 Then
Sum = 0
For JJ = 1 To NNODE
If JJ <> L Then
Sum = Sum + (G(L, JJ) + P(L, JJ) / DT) * HNEW(JJ)
End If
Next JJ
HNEW(L) = (-Sum + B(L)) / (G(L, L) + P(L, L) / DT)
End If
Next L
'// PUTS HNEW VALUES INTO HOLD ARRAY FOR NEXT TIME STEP.
For L = 1 To NNODE
HOLD(L) = HNEW(L)
Next L
'// PRINT RESULTS FOR EVERY OTHER TIME STEP.
TIME = TIME + DT
KOUNT = KOUNT + 1
For I = 2 To NNODE Step 2
Debug.Print I, FormatNumber(HOLD(I), 2)
Next I
Debug.Print "---------"
Debug.Print TIME, KOUNT
Next NSTEP
End Sub , ----
By Renfield
faid007
Messages postés17Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention 5 janvier 2008 18 juil. 2007 à 19:10
Merci pour vos Remarque EBArtSoft & BruNews, vraiment il faut ke je revoir le C! (depuis 2004 j'ais pas utilisé se langage!). pour le programme propose par Renfield, malheursement il ne donne pas les resultats correcte.
voici les resultats qui donne le prog en C. et si c'est possible de le corriger car moi chui Blocké!
Merci infiniment
Je devine... je devine...
Mais voyons :
Il dit :
1) qu'il a écrit ce code C
2) que ce code s'exécute à sa pleine satisfaction...
Je le crois donc (tout comme RenField), ma foi...
Et le développement dans un langage, c'est comme la bicyclette... quand on a su, on sait.
2007-2004 = à peine 3 ans (et des raisons indépendantes de ma volonté m'ont empêché de même approcher un clavier pendant un peu plus de 4 ans, sans que j'en aie réellement "souffert" à la reprise ...)
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 19 juil. 2007 à 00:44
En même temps si mes souvenirs sont bon... en 12 ans de programmation je n'ai jamais utilisé de forum pour resoudre mes problemes. Bien que l'internet soit une source d'inspiration debordante un bon livre fera toujours l'affaire.
Il est beaucoup plus facile de s'en remettre a autruie.
Bref je vais pas pourrir sa question avec mes considerations phylosophiques cela dit je lui conseil fortement d'en savoir un peu plus sur le "pourquoi cela ne marche t'il pas" plutot que de chercher une solution toute faite car il ce peut qu'il soit de nouveau confronté au probleme dans l'avenir et que le forum n'est pas la solution miracle du devellopeur professionel.
Il faut ce poser les bonnes questions avant de tenter de resoudre et parfois même ce remettre en question.
1 - J'ai un probleme ==> je vais demander a quelqu'un de m'aider
2 - J'ai a nouveau le probleme => je vais a nouveau demander
ou bien
1 - J'ai un probleme ==> pourquoi je n'arrive pas a la resoudre ==> comment puis je aquerir les connaissance necessaire pour le reoudre
2 - J'ai a nouveau le probleme ==> mais j'ai aqui les connaisances et je vais parvenir a le reoudre
bon je sais c'est completement utopique d'ecrire ça sur un forum de dev mais bon... il est tard je vais aller me coucher et demain tout ira mieu :-p
faid007
Messages postés17Date d'inscriptiondimanche 9 janvier 2005StatutMembreDernière intervention 5 janvier 2008 19 juil. 2007 à 01:33
Merci 615490 jmfmarques et =15669 EBArtSoft pour les conseilles; a vrais dire moi je me suis dévier de la programmation pour des raisons professionnelle, pour se petit exercice je le fait a la demande d’un ami ‘c’est pas moi qui a écrit le code en C’ moi j’ai écrit juste le code en VB. Et je ne sais même pas l’intérêt du programme. !! et avant de poster mon problème dans se forum, j’ai récrit le code plus de 5 fois, et j’ai pas arrivé a détecter l’erreur. Merci une autre fois et bonne nuit !