Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)
Курстық жұмыс
Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)
Алматы 2012
Мазмұны
Кіріспе 1
1. Мәселенің қойылуы 4
1.1.Екі фазалы
фильтрация жағдайындағы
1.2. Мұнайды
алуға полимерді пайдалану……………
2. Есепті шешу әдістері мен
алгоритмдері..................
2.1. Сандық әдістер көмегімен
қойылған есептерді шешу…………………
2.1.1. Фазалардың қысымдарын табу…………………………………………....9
2.1.2. Жылдамдықтарды табу…………………………………………………..10
2.1.3. Фазалардың қанықтылықтарын табу……………………………………10
2.1.4. Полимердің концентрациясын табу……………………………………..10
3. Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритм…… .....11
Қорытынды………………………………………………………
Қолданылған әдебиеттер……………………………………………………
Қосымша……………………………………………………………
Кіріспе
Араласпайтын сұйықтардың фильтрациясы, эксплуатациондық скважиналардың интенсификация әдістерін жүзеге асырумен байланысты әр түрлі заттардың су ерітінділерімен әрекеттесу және пласттың мұнай бергіштігін арттыру процесттерін зерттеу әрқашан актуалды болып келеді. Мұнай мен газдың қорының азаюы, араласпайтын сұйықтардың фильтрациясының физикалық заңдылықтарын тереңнен оқып зерттеуін талап етеді.
Мұнай, газ, жер асты сулары жердің қойнында, дәлірек айтқанда, жер асты қуыстарында – тау жыныстарының пораларында және сызаттарында жататыны жалпыға мәлім. Бұл табиғи сұйықтарды флюидтер деп атау қабылданған. Флюидтер табиғи процестер салдарынан немесе адамдардың іс-әрекеті нәтижесінен үздіксіз қозғалыста болады. Флюидтердің бір-бірімен байланысқан поралары немесе сызаттары бар қатты денелер арқылы қозғалысы фильтрация деп аталады.
Фильтрация теориясы – тұтас орта механикасының көзқарасы тұрғысынан флюидтердің қозғалысын сипаттайтын жер асты гидромеханикасының теоретикалық негізі.
Флюидтерді сыйдыра алатын және флюидтер солар арқылы қозғала алатын тау жыныстары пласт немесе пласт-коллектор деп аталады.
Тау жыныстарының (пласттың) сұйықтарды (флюидтерді) сыйдыру және өзі арқылы өткізу қасиеттері пласттың фильтрациялық-сыйымдылық қасиеттері деп аталады, оның ішінде: кеуектілік, өтімділік (проницаемость), филтрация жылдамдығы және т.б. бар.
Сұйықтың кеуекті ортадағы фильтрация ерекшеліктерін жүйелі зерттеудің басы XIX ғасырда француз инженері Анри Дарсидің еңбектерімен басталған.
Қазіргі таңдағы мұнай өндіру әдістерінде мұнайдың біршама бөлігі жер бетіне шығарылмай пластта қалып қалу мәселелерін тудырады. Ең болмағанда мұнай өндіру көлемін бір пайызға көтерудің өзі ел экономикасына әсерін тигізеді. Шет елдерде полимерлі заводнение технологиясын зерттеу анализдері бұл әдістің технологиялық эффективтилигіне куә болып табылады. Бірақта дәстүрлі мұнай кенінде кеңінен таралған полимерді пайдалану әдісіне қарамастан, тұтқырлығы жоғары мұнайды ығыстыру процесінде полимерді қолданылу зерттеуі толығымен жетілмеген.
Мәселенің қойылуы
- Екі фазалы фильтрация жағдайындағы математикалық моделін құру.
Мұнда мұнайды өндірудің әдісін сипаттайтын кеуекті ортадағы екі фазалық фильтрация моделін қарастырамыз. Бұл тәсілде баспа скважинасына өндіруші скважинадан шығатын мұнайды ығыстыратын су айдалады. Бұл процестің сандық модельденуі мұнай-газ кен орнын игерудің тиімді стратегиясын тұрғызу үшін керек.
Сұйықтар арасында шекара
болып және ол шекара қозғалыста болса,
онда ығыстырушы сұйықтық алдын ала
ығыстырылатын сұйықтықпен
Модель суды айдау процесін
сипаттау үшін қолданылады, бұл процесс
барысында баспа скважинасына айдалған
су кеуекті ортада мұнайды ығыстырады.
Мұнай скважинасының дебиті (яғни,
өндірілім көлемі) оның негізгі техникалық-
Бұл тарауда мұнай өндіруде
суды айдау әдісі кезіндегі
Су мен мұнайдың қанықтылығы келесі теңдеулер жүйесімен сипатталады:
мұндағы
m- ортаның кеуектілігі; 1-су, 2-мұнай; сәйкесінше су мен мұнайдың қанықтылығы; жылдамдықтары; шығындары.
Дарси заңы заңы бойынша сәйкес жылдамдықтарды табамыз:
Өтімділігі салыстырмалы фазалық өтімділігіне тәуелді:
мұндағы, капиллярлық қысым.
Ал фазалардың шығындарын келесі Дюпии формуласы бойынша шығарып аламыз:
- Мұнайды алуға полимерді пайдалану
Полимерное заводнение дегеніміз судың қозғалғыштығын азайту үшін полимердың қосылуын айтамыз. Полимерді судың тұтқырлығын жоғарлытып, оны қоюлатуға көмектеседі. Бұл қозғалғыштық қатынастың азаюы аймақты көбірек коэффициентпен қамту және тазаланған аймақта мұнай қанықтылығының азаю есебінен полимер пайдаланудың эффективтілігін арттырады.
Адсорбция полимер молекулары мен қатты бет арасындағы өзара әсерлесуін жатады. Бұл әсерлесу полимердің молекулалары қатты бетпен физикалық адсорбциямен міндетті байланыста болу қажетілігін шақырады.
Адсорбция ерiтiндiнiң көлемiнен полимерді алып тастайтын жалғыз тетiк болып табылады. Демек, тасқын суларда полимердiң шоғырландыруы және тұтқырлықты азай фазаның ауысуын азаяды. Бұл оқиға рок су қоймасына ерiтiндiден полимердiң алып тастауын полимерiнiң тасқынына жолынан адсорбция әлденеше байқалды. Банкте полимердiң үлкен немесе аз көлемін жоғалтуы, бұл полимердiң табиғаты мен жыныстың бетi тәуелдi болу керек.
Сурет 2.1. көрсетілгендей мұнда тазартылған суға қарағанда қабаттық судағы адсорбция жоғары. Полимердің концентрациясы жоғары болуы адсорбцияның үлкеюін көрсетеді. Полимер молекулалары жыныстардың бетінде адсорбцияланады. Адсорбция артықшылықтары:
- Адсорбцирленген полимердің сумен дымқылданғыштығы жоғары болады;
- Судың қанықтылығын жоғарлатады.
Полимер концентрациясы
Сурет 2.1 Полимердің концентрациясымен адсорбциясының арасындағы байланыс
Полимердің концентрациясының өзгеруі.
Көп мөлшердегі полимердің ерітндегі концентрацияся сурет 2.2 көрсетілгендей тұтқырлықта өседі. Соған сәйкес мұнай алудың көлемі өседі. Бұл нәтижені келесі сурет 2.3-те көруге болады.
Сурет 2.2. Полимер концентрациясының тұтқырлықпен салыстырылуы
Сурет 2.3. Мұнайды алудағы полимер концентрациясының эффективтілігі
Полимер экономикалық тұрғыда қымбат материал болғандықтан, оны белгілі бір концетрациясында қосады.
- ЕСЕПТІ ШЕШУ ӘДІСТЕРІ МЕН АЛГОРИТМДЕРІ
- Сандық әдістер көмегімен қойылған есептерді шешу
Қойылған есепті шешу үшін келесі гипотезалар орындалады деп есептейік:
– флюидтер сығылмайды,
– орта біртекті,
– ағыс бір өлшемді,
– ағыс горизонтальды,
– капиллярлық қысым
Бастапқы және шекаралық шарттарын белгілейміз:
Бастапқы шарты t=0 және болған жағдайда, Дирихле және Нейман шарттары:
P(x)=Pпл,
S1(x)=0,3
S2(x)=0,7
C(x)=0,5
C|x=1=0
D=0,3
- Фазалардың қысымдарын табу
- жүйені шешу үшін су мен мұнайдың масса сақталу заңдарын қосу арқылы мынадай теңдік аламыз:
мұндағы, (4)-теңдік бойынша .
Жылдамдықтардың орнына (2)-теңдікті қою арқылы келесі теңдеуді шығарамыз:
Капиллярлық қысым ескерілмегендіктен .
(9)-теңдікті шешу сандық әдістер қолданамыз. Айқын сұлба бойынша итерациялық Якоби-Зейдель әдісімен сандық есептейміз:
Қойылған есепті бір өлшемді жағдайда карастырамыз.
,
мұндағы, i=.
Бастапқы шекаралық шарты:
(15) формуланы өрнектеу арқылы қысымды табамыз
(16)
- Жылдамдықтарды табу
Табылған қысым бойынша жылдамдықты есептейміз:
- Фазалардың қанықтылықтарын табу
Қысым көмегімен судың қанықтылығын есептейміз.
(1)-теңдікті қысым арқылы өрнектейміз:
, , i=.
(20)
(4)-теңдеу көмегімен мұнайдың қанықтылығын табамыз:
- Полимердің концентрациясын табу
(23)
(24)
- Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритм
Екі нүктелі ауысу
MPI-технологиясында жазылған
барлық программалар параллель
процесстерді ашу, жабумен
Осы топтардағы барлық процедуралар
екі топқа бөлінеді: блокталған процедура(синхрондалған)
және блокталмаған(асинхрондалған).
Блоктауы бар хабарлама жіберу/қабылдау
MPI_SEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR)
<type> BUF (*)
INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR
BUF массиві (ақпарат), MSGTAG ақпарат идентификаторы, COUNT элемент саны, DATATYPE ақпарат типі, DEST процесс нөмірі, COMM коммуникаторы бар хабарлама жіберу. Жіберілетін ақпараттың барлық элементтері BUF буферінде орналасуы тиіс. Сонымен қатар ақпарат қабылдау буферіне көшіріледі (жүйелік буфер, егер ол MPI-да көрсетілген болса). COUNT-ң мәні нөл болуы мүмкін. Процесске өз-өзіне ақпарат жіберу рұқсат етіледі, бірақ ол қауіпті емес және ақпарат алмасудағы кедергілік жағдайларға әкеліп тіреледі. DATATYPE параметрі Фортран тілінде INTEGER типін алу керек ( Си тілінде – алдын ала анықталып қойған MPI_Datatype типі). Жіберілетін элементтердің типі алдын ала анықталған тұрақтылар типімен көрсетілуі керек, Фортран тіліне арналғн типтер елесі кестеде көрсетілген.
Егер MPI- мен қолданылатын базалық тілде қосымша деректер типі бар болса, онда сәйкес типтер MPI- да да қамтамасыз етілуі керек. Алдын –ала анықталған деректер типі атауларының толық тізімі mpif.h (mpi.h) файлында саналған.
Хабарламаны қайта жіберу кезінде жоқ процесс үшін MPI_PROC_NULL арнайы мәнін қолдануға болады. Мұндай процессті операциялар MPI_SUCCESS аяқталу кодымен тез түрде аяқталуы керек. Мысалы, бірден үлкен нөмірі бар процесске хабарламаны қайта жіберу үшін келесі фрагментті қолдануға болады:
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
next = rank+1
if(next .eq. size) next = MPI_PROC_NULL
call MPI_SEND(buf, 1, MPI_REAL, next,
& 5, MPI_COMM_WORLD, ierr)
Бұл жағдайда соңғы нөмірлі
процесс деректердің шын жіберу
мүмкіндігін орындамайды, керісінше
программаны ары қарай
Блоктау процедурадан қайтарылғаннан
кейін барлық параметрлердің қолдануының
қайталануының дұрыстығына
MPI_SEND процедурасынан қайтару хабарлама DEST процессінен алынғанын немесе берілген шақыру орындалатын процесс жүзеге асатын процессорлық элемент хабарламаны тастап кетуін санамайтынын айтып кеткен жөн. Берілген процедураның шақыруында қолданатын айнымалылардың қауіпсіз өзгеруінің кепілі қана беріледі. Мұндай анықталмағандық қолданушыға әрқашан да ұнамауы мүмкін. Хабарлама жіберудің мүмкіндіктерін кеңейту үшін MPI- да қосымша үш процедура енгізілген. Бұл процедуралардың параметрлері MPI_SEND- тікі сияқты, бірақ әрқайсысының өз ерекшелігі бар.
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSTAG, COMM, STATUS, IERR)
<type> BUF (*)
INTEGER COUNT, DATATYPE, SOURCE, MSTAG, COMM, IERR,
STATUS (MPI_STATUS_SIZE)
DATATYPE типті COUNT хабар элементтерін BUF буферіне блоктау қабылдау. Егер нақты қабылданған элементтердің саны COUNT мәнінен аз болса, онда BUF буферінде тек қана қабылданған хабардың элементтеріне сәйкес болатын элементтер өзгереді. Егер қабылданатын хабардың элементтер саны COUNT мәнінен көп болса, онда толып кету қатесі пайда болады. Осыған жеткізбеу үшін біріншіден MPI_PROBE (MPI_IPROBE) процедурасы көмегімен қабылданатын хабардың құрылымын анықтау керек. Егер қабылданатын хабардың элементтерінің нақты санын анықтау керек болса, онда MPI_GET_COUNT процедурасын пайдалануға болады. Блоктау(блокировка) мынаған кепілдік береді: барлық хабарлар элементтері MPI_RECV процедурасынан қайтқаннан кейін BUF буферінде қабылданады және орналасады.
Төменде нөлдік процесс бір
нөмірлі процесске хабар
Қойылған есепті параллельдеу үшін келесі алгоритмді қолданамыз:
Пр1(0,m+1) Пр2(0,m+1)
Тізбектей және параллель алгоритмнің нәтижесі
Сурет 3.1. Қысымның тізбектей бағдарлама арқылы алынған графигі
Сурет 3.2. Өтімділік коэффициенті тізбектей бағдарлама арқылы алынған графигі
Сурет 3.3. Қысымның параллель алгоритм бойынша алынған графигі
Қорытынды
Қазіргі кезде мұнай өндіру саласында скважинаға суды айдау процесі, оның математикалық модельденуі және сандық әдістермен шешілуі өте маңызды роль атқарады. Біз алдын ала сандық әдістермен судың пласттағы жайылу процесі мен өндіруші скважинаға жету уақытын көрсету мұнай өндіру дебитін көтеруге пайдасын тигізеді. Өйткені, баспа скважинасынан айдалған судың өндіруші скважинаға жеткен уақытында өндіруші скважинадағы мұнай дебиті шұғыл төмендеп кетеді және су мұнайға қарағанда көбірек шығады. Яғни бұл процесті ары қарай жалғастыра беретін болсақ бұл экономикалық жағынан тиімсіз болады.
Жоғарыда қарастырылған
фазалардың қысымдары бірдей деп
саналатын араласпайтын ығыстыру Баклей-Леверетт
схемасы екіфазалық сұйықтардың
фильтрация теориясындағы ең қарапайымы
болып табылады. Бұл модельде қозғалыстағы
араласпайтын сұйық фазалардың шекараларындағы
капиллярлық қысым өзгерісінің
болмауы туралы қабылданған жорамал
негізгі дифференциалдық
ҚОЛДАНЫЛҒАН ӘДЕБИЕТТЕР
- Маскет М. Течение однородных жидкостей в пористой среде. – М. – Л.: Гостоптехиздат, 1949. – 628 с.
- Шейдеггер А.Э. Физика течения жидкостей через пористые среды: Пер. с англ. – М.: Гостоптехиздат, 1960. – 249с.
- Баренблатт Г. И., Ентов В. М., Рыжик В.М. Движение жидкостей и газов в природных пластах. – М.: Недра, 1984. – 207с.
- Данаев Н.Т., Корсакова Н. К., Пеньковский В. И. Массаперенос в прискважинной зоне и электромагитный каротаж пластов. – Алматы: Қазақ университеті, 2005. – 200с.
- Бакирова М. И., Зембеков Н. А., Карпов В.Я. Метод моделирования задачи фильтрации со скачком насыщенности. Институт математического моделирования РАН
- OMAR KALIFA HAMMUDA ALUHWAL. SIMULATION STUDY OF IMPROVING OIL RECOVERY BY POLYMER FLOODING IN A MALAYSIAN RESERVOIR
- Д.А. Беликов, И.В. Говязов, Е.А. Данилкин, В.И. Лаева, С.А. Проханов,А.В. Старченко.В 93 Высокопроизводительные вычисления на кластерах: Учебн. пособие/Под ред. А.В. Старченко. – Томск: Изд-во Том. ун-та, 2008. – 198 с.ISBN 978-5-7511-1879-2
Қосымша
Java тілінде жазылған тізбектей код бір өлшемді үшін
import java.io.*;
import mpi.*;
import utils.*;
public class Main {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
MPI.Init(args);
int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();
if (rank==0) {
System.out.println("rank= " + rank);
int m,i,itr;
m=100;
//System.out.println("S= " + s);
double[] pold = new double[m + 2];
double[] pnew = new double[m + 2];
double[] fm = new double[m + 2];
double[] km = new double[m + 2];
double[] ko = new double[m + 2];
double[] pd = new double[m + 2];
double[] pnag = new double[m + 2];
double[] lqsk = new double[m + 2];
double[] qsk = new double[m + 2];
double diffnorm, gdiffnorm, eps, sdiffnorm, sgdiffnorm;
double h1,tau;
double f1,f2,mu1,mu2,rc;
boolean converged;
int ii, rp;
String no, name;
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];
}
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;
rc = h1 * 0.5;
itr = 0;
do {
for (i = 0; i <= (m + 1); i++) {
ko[i]=0.5+0.1*Math.sin(2*3.
km[i]=ko[i]*(f1/mu1)+ko[i]*(
}
for (i = 0; i <= (m+1); i++) {
qsk[i] = lqsk[i]*(-pnag[i] - pd[i])*(2 * 3.14 * km[i] / ((double) (Math.log(0.2 * h1 / rc))));
fm[i] = 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 <= m; 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 <= (m); i++) {
pold[i] = pnew[i];
}
///////////////shekaralik shart
gdiffnorm = (diffnorm);
gdiffnorm = (double) Math.sqrt((double) gdiffnorm);
converged = (gdiffnorm < eps);
System.out.println("pk=" + k);
} while (gdiffnorm > eps);
///*********************
//pold[0]=0.4;
//pold[m+1]=0.4;
pold[0]=pold[1]; //0.4;
pold[m+1]=pold[m]; //0.4;
for (i = 1; i <= (m ); i++) {
System.out.println("itr="+itr +";pold[" +i +"]=" + pold[i]);
//System.out.println(pold[i]);
}
if (itr%10==0) {
no = file_no(itr);
name = "P".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 + " " +pold[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;
}
}
Параллеьдеу алгоритмі
import java.io.*;
import mpi.*;
import utils.*;
public class Main {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
int m,i,itr,n;
m=100;
//n=100;
//System.out.println("S= " + s);
double[] pold = new double[m + 2];
double[] pnew = new double[m + 2];
double[] fm = new double[m + 2];
double[] km = new double[m + 2];
double[] ko = new double[m + 2];
double[] pd = new double[m + 2];
double[] pnag = new double[m + 2];
double[] lqsk = new double[m + 2];
double[] qsk = new double[m + 2];
double diffnorm, gdiffnorm, eps, sdiffnorm, sgdiffnorm;
double h1,tau;