Untitled
unknown
plain_text
2 years ago
2.9 kB
7
Indexable
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h> #include <time.h> #include <omp.h> #define C 1 #define m 20 #define T 5 #define dt 0.01 //========================= void DisplayMatrix(float *A, int row, int col) { int i,j; for(i=0;i<row;i++){ for(j=0;j<col;j++) printf(" %f",*(A+i*col+j)); printf("\n"); } } //========================= void Write2File(float *A, int row, int col) { FILE *result=fopen("ViberStringC1.txt", "a"); int i,j; for(i=0;i<row;i++){ for(j=0;j<col;j++){ fprintf(result, "%lf\t", *(A+i*col+j)); } fprintf(result, "\n"); } fprintf(result, "\n"); fclose(result); } //========================= void KhoiTao(float *Phi_old,float *Phi_current) { int i; float dx,X; dx = 1.0/(m-1); for (i = 0 ; i < m ; i++){ X = i*dx; // Phi_old is the same as Phi_current *(Phi_old+i)= sin(2.0*M_PI*X); *(Phi_current+i) = *(Phi_old+i); } } //========================= void FD(float *Phi_current,float *dPhi, int start, int end) { int i; float c,l,r; for (i = start ; i < end ; i++){ c = *(Phi_current+i); l = (i==0) ? - *(Phi_current+i+1) : *(Phi_current+i-1); //left neighbor = -r in order to to dPhi=0 r = (i==m-1) ? - *(Phi_current+i-1) : *(Phi_current+i+1); //right neighbor = -l in order to dPhi=0 *(dPhi+i) = l - 2*c + r; } } //========================= int main() { int i; float dx,t,tau; t = 0.0; float *Phi_old,*Phi_current,*Phi_new,*dPhi; Phi_old = (float *) malloc (m*sizeof(float)); Phi_current = (float *) malloc (m*sizeof(float)); Phi_new = (float *) malloc (m*sizeof(float)); dPhi = (float *) malloc (m*sizeof(float)); KhoiTao(Phi_old,Phi_current); Write2File(Phi_current,m,1); printf("Gia tri khoi tao:\n"); DisplayMatrix(Phi_old, m, 1); dx = 1.0/(m-1); tau = C*dt/dx; // Parallel bro int NT, Mc, ID, start, stop; omp_set_num_threads(4); #pragma omp parallel private(ID,start,stop,i, t, Mc) { ID = omp_get_thread_num(); NT = omp_get_num_threads(); Mc = m/NT; start = ID*Mc; stop = start + Mc; while (t<=T) { FD(Phi_current, dPhi, start, stop); #pragma omp barrier // synchronise for (i = start ; i < stop ; i++) *(Phi_new+i) = 2*(*(Phi_current+i)) - *(Phi_old+i) + tau*tau*(*(dPhi+i)); for (i = start ; i < stop ; i++){ *(Phi_old+i) = *(Phi_current+i); *(Phi_current+i) = *(Phi_new+i); } t=t+dt; #pragma omp barrier // synchronise for writing file #pragma omp single { Write2File(Phi_current,m,1); } // auto pragma omp barrier after omp single } } printf("Gia tri cuoi cung:\n"); DisplayMatrix(Phi_current, m, 1); return 0; }
Editor is loading...