Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)

Автор работы: Пользователь скрыл имя, 30 Мая 2013 в 16:30, курсовая работа

Описание

Қазіргі таңдағы мұнай өндіру әдістерінде мұнайдың біршама бөлігі жер бетіне шығарылмай пластта қалып қалу мәселелерін тудырады. Ең болмағанда мұнай өндіру көлемін бір пайызға көтерудің өзі ел экономикасына әсерін тигізеді. Шет елдерде полимерлі заводнение технологиясын зерттеу анализдері бұл әдістің технологиялық эффективтилигіне куә болып табылады. Бірақта дәстүрлі мұнай кенінде кеңінен таралған полимерді пайдалану әдісіне қарамастан, тұтқырлығы жоғары мұнайды ығыстыру процесінде полимерді қолданылу зерттеуі толығымен жетілмеген.

Содержание

Кіріспе 1
1. Мәселенің қойылуы 4
1.1.Екі фазалы фильтрация жағдайындағы математикалық моделін құру…....4
1.2. Мұнайды алуға полимерді пайдалану………………………………………6
2. Есепті шешу әдістері мен алгоритмдері...........................................................8
2.1. Сандық әдістер көмегімен қойылған есептерді шешу…………………….8
2.1.1. Фазалардың қысымдарын табу…………………………………………....9
2.1.2. Жылдамдықтарды табу…………………………………………………..10
2.1.3. Фазалардың қанықтылықтарын табу……………………………………10
2.1.4. Полимердің концентрациясын табу……………………………………..10
3. Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритм…… .....11
Қорытынды………………………………………………………………………16
Қолданылған әдебиеттер………………………………………………………..17
Қосымша…………………………………………………………………………18

Работа состоит из  1 файл

курсовая работа .docx

— 215.14 Кб (Скачать документ)

double f1,f2,mu1,mu2,rc;

boolean converged;

int ii, rp;

String no, name;

double[] rsendbuf = new double[2];

double[] lsendbuf = new double[2];

double[] lrecvbuf = new double[2];

double[] rrecvbuf = new double[2];

 

MPI.Init(args);

int rank = MPI.COMM_WORLD.Rank();

int size = MPI.COMM_WORLD.Size();

// int IAM = MPI.COMM_WORLD.Rank();

// int NPROCS = MPI.COMM_WORLD.Size();

System.out.println("process" + rank + ",size" + size);

 

n = (int) (m * 1. / size);

if (rank < (m - size * n)) {

n = n + 1;

}

double[] kmr = new double[n + 2]; 

double[] z = new double[m + 2];

//if (rank==0) {

System.out.println("rank= " + rank);

 

 

h1 = 1. / m; eps = 0.01;

f1=0.1; f2=8;

mu1=1; mu2=10;

 

tau = (double) ((Math.pow(h1, 2)) * 0.5*0.01);

 

for (i = 0; i <= (m + 1); i++) {

pold[i] = 0.4;

fm[i] = 0.;

pnew[i] = pold[i];

// System.out.println("pold[" +i +"]=" + pold[i]);

}

 

 

for (i = 0; i <= (m + 1); i++) {

qsk[i] = 0.0;

lqsk[i] = 0.0;

pd[i] = 0.0;

pnag[i] = 0.0;

}

 

pnag[25] = 1.0;

lqsk[25] = 1.0;

 

pd[75] = 1.0;

lqsk[75] = -1.0;

 

//pnag[m/2+m/4]=10.0;

//lqsk[m/2+m/4]=1.0;

 

rc = h1 * 0.5;

 

itr = 0;

 

do {

 

 

for (i = 0; i <= (m + 1); i++) {

  ko[i]=0.5+0.1*Math.sin(2*3.14*i*h1);

  km[i]=ko[i]*(f1/mu1)+ko[i]*(f2/mu2);

  //System.out.println("itr="+itr +";km[" +i +"]=" + km[i]);

}

 

for (i = n * rank + 1; i <= n * (rank + 1); i++) {

kmr[i - n * rank] =km[i];

 

qsk[i] = lqsk[i]*(-pnag[i] - pd[i])*(2 * 3.14 * kmr[i - n * rank] / ((double) (Math.log(0.2 * h1 / rc))));

fm[i - n * rank] = qsk[i];

}

 

 

 

 

 

 

/////*******************

int k = 0;

int itcnt = 0;

do {

k = k + 1;

diffnorm = 0.0;

 

itcnt = itcnt + 1;

//

//

 

double s1 = 0.f;

double s2 = 0.f;

//

           /// proneciamost'

 

 

for(i = 1; i <= n; i++) {

 

s1 = 0.5 * (km[i + 1] + km[i]);

s2 = 0.5 * (km[i - 1] + km[i]);

pnew[i] = (s2 * pold[i - 1] + s1 * pold[i + 1]+ h1*h1*fm[i])

/ (s1 + s2);

diffnorm = (diffnorm + ((double) Math.pow(((pnew[i] - pold[i])), 2)));

 

}

 

 

//

 

for (i = 1; i <= (n); i++) {

 

pold[i] = pnew[i];

 

}

///////////////shekaralik shart

 

 

rsendbuf[1]=pnew[n]; lsendbuf[1]=pnew[1];

lrecvbuf[1]=100; rrecvbuf[1]=1000;

 

if (rank == 0) {

MPI.COMM_WORLD.Send(rsendbuf,1,1,MPI.DOUBLE,rank+1,99);

}

else {

if (rank == size - 1) {

MPI.COMM_WORLD.Recv(lrecvbuf,1,1,MPI.DOUBLE,rank-1,99);

pold[0]=lrecvbuf[1];

}

else {

MPI.COMM_WORLD.Sendrecv(rsendbuf,1,1,MPI.DOUBLE,rank+1,99,lrecvbuf,1,1,MPI.DOUBLE,rank-1,99);

pold[0]=lrecvbuf[1];

}

}

 

System.out.println("lrecvbuf[1]=" + lrecvbuf[1]+ ",IAM=" + rank);

 

if (rank == size - 1) {

MPI.COMM_WORLD.Send(lsendbuf,1,1,MPI.DOUBLE,rank-1,99);

}

else {

if (rank == 0) {

MPI.COMM_WORLD.Recv(rrecvbuf,1,1,MPI.DOUBLE,rank+1,99);

pold[n+1]=rrecvbuf[1];

}

else {

MPI.COMM_WORLD.Sendrecv(lsendbuf,1,1,MPI.DOUBLE,rank-1,99,rrecvbuf,1,1,MPI.DOUBLE,rank+1,99);

pold[n+1]=rrecvbuf[1];

}

}

 

System.out.println("Rrecvbuf[4]=" + rrecvbuf[1]+ ",IAM=" + rank);

 

 

 

gdiffnorm = MPJUtils.Allreduce(diffnorm);

 

 

 

//gdiffnorm = (diffnorm);

 

 

gdiffnorm = (double) Math.sqrt((double) gdiffnorm);

converged = (gdiffnorm < eps);

 

System.out.println("pk=" + k);

} while (gdiffnorm > eps);

///*********************

 

 

 

if (rank == 0) {

pold[0] = pold[1];

}

 

// !------------shekara P(i,N2)

if (rank == size - 1) {

 

pold[n + 1] = pold[n];// !0. ! 1.0

}

 

 

 

for (i = 1; i <= (n ); i++) {

System.out.println("rank="+rank +";itr="+itr +";pold[" +i +"]=" + pold[i]);

//System.out.println(pold[i]);

}

 

double[] rbuf = new double[n+2]; 

 

if(rank==0) {

for (i = 1; i <= (m ); i++) {

   z[i] = pold[i];}

 

for (int j = 1; j <= (size-1); j++) {

        int lm = n * j;

     

      MPI.COMM_WORLD.Recv(rbuf,1,n,MPI.DOUBLE,j,99);

     for (i = 1; i <= (n); i++) {

      z[i+lm]=rbuf[i];}

}}

else {

       MPI.COMM_WORLD.Send(pold,1,n,MPI.DOUBLE,0,99);

}  

 

 

if(rank==0) {

if (itr%10==0) {

no = file_no(itr);

name = "z".concat(no);

name = name.concat(".dat");

 

FileOutputStream fout1 = new FileOutputStream(name);

PrintStream out = new PrintStream(fout1);

//out.println("TITLE = \"Example: Simple 2D-Volume Data\"");

out.println("X\", \"P\", \"km\"");

//out.println("ZONE I=" + (m) + ", F=POINT");

 

 

for (i = 1; i <= m; i++) {

 

out.println((float) i + " " +z[i] + " " +km[i]);

 

}

 

fout1.close();

}

}

 

itr = itr + 1;

} while (itr <= 100); // itr

// }

//System.out.println("Hi from " + rank);

 

MPI.Finalize();

}

public static String file_no(int ii) {

char[] c = new char[10];

String c1, no;

c[0] = '0';

c[1] = '1';

c[2] = '2';

c[3] = '3';

c[4] = '4';

c[5] = '5';

c[6] = '6';

c[7] = '7';

c[8] = '8';

c[9] = '9';

if (ii < 10) {

no = "000";

c1 = Character.toString(c[ii]);

no = no.concat(c1);

} else if (ii < 100) {

no = "00";

c1 = Character.toString(c[ii / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

} else if (ii < 1000) {

no = "0";

c1 = Character.toString(c[ii / 100]);

no = no.concat(c1);

c1 = Character.toString(c[(ii % 100) / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

} else {

no = Character.toString(c[ii / 1000]);

c1 = Character.toString(c[(ii % 1000) / 100]);

no = no.concat(c1);

c1 = Character.toString(c[(ii % 100) / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

}

return no;

}

 

}


Информация о работе Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)