Шумил Павел: другие произведения.

Тепловые процессы в земной коре

Журнал "Самиздат": [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь]
 Ваша оценка:

Чтоб разговоры о программировании обрели конкретику, выложил на свой сайт
транслятор Паскаля, работающий в пакетном режиме (то есть, запускаемый из
командной строки)

 http://dragonbase.nek0.net/p2c/Pascal-2005.rar



             Пакетный транслятор Pascal-2005
      (выдранный с мясом из дистрибутива Delphi 2005)


Запуск трансляции командой

DCC32.EXE <имя_программы>.pas
Или просто
DCC32 <имя_программы>.pas

===============

      С О С Т А В

DCC32.EXE
RLINK32.DLL

Сам транслятор. Эти файлы можно переписать в Windows\system32

===============

Sourse\SysInit.pas
Sourse\System.pas

Эти файлы-первоисточники приведены для шибко любопытных

===============

SysInit.dcu
System.dcu

А эти файлы должны лежать рядом с вашей программой. (<Имя_файла>.pas)
В другом месте Паскаль-2005 их не найдет.

===============
===============
===============

      ПРИМЕР ТЕСТОВОЙ ПРОГРАММЫ (кодировка - DOS)

program hello; { тест }

{$APPTYPE CONSOLE}  { Эта строка для Delphi-2005 }
{ Трансляция под Дельфи:  dcc32 hello.pas        }

{ Uses crt; } { Эта строка для Турбо-паскаля }
{ Трансляция в среде Турбо-паскаля:  ctrl/F9 }


type int=integer; bool=boolean; long=longint;

const tr=true; fl=false; { Пример сокращения для ленивых }

var a,b,c: int;

{ - - - - Собственно, основная часть программы - - - - }

begin
a:=2; b:=3; c:=a*b;
writeln; writeln; writeln(c);
writeln(' Привет, ребята! '); writeln;
end.

=============================================================
=============================================================
=============================================================

      Теперь - о главном. Тепловые процессы в земной коре

program kora(f,i);

{$APPTYPE CONSOLE}

label 3,9;

type int=integer; bool=boolean; long=longint;

const tr=true; fl=false; Pi=3.14159265;


{ Исходные параметры.  Земная кора - 10 км.  Под ней - магма.  }
{ Обсчитывается колодец от поверхности до магмы площадью 1кв.м }


Tn=0;      { Начальная температура слоев, К }
Tm=1773;   { Температура магмы, К }

RoB=840;   { Удельная теплоемкость базальта дж/(кг*К) }
TPr=3.5;   { Теплопроводность базальта вт/(м*К)       }
PlB=2800;  { Плотность базальта кг/куб.м    }

SolC=1500; { Солнечная постоянная вт/кв.м   }
kAlb=0.9;  { Возьмем альбедо Луны 1-0.1=0.9 }


Sloy=10;    { Tолщина кванта слоя (см) (меньше 1см НЕЛЬЗЯ!) }
Kvant=10;   { Квант времени (сек) (меньше 1 сек НЕЛЬЗЯ!)    }


var 

{ Земная кора }

chas: long; { Кол-во циклов на час модельного времени }
Kon: long;  { Кол-во слоев в рассчетах (на 10км коры) }
Msl: real;  { Масса слоя (кг) }

god,day: long; { Текущий год, текущий день   }

Sl: real;      { Приведенный слой (в метрах) }
prRo: real;    { приведенная теплоемкость    }
Raznos: bool;  { tr - модель пошла вразнос. Меняю алгоритм, падает точность }

tekT: long;       { Текущее время суток (в квантах)           }
Vos,zak,dl: long; { Восход, закат, длит. свет. дня в квантах  }
psp: real;     { Приведенная солн. постоянная. (к широте, ко времени года)  }
Ppl,Pmin: real;{ Получено от Солнца, ушло в космос излучением }


tem,p: array[0..1000001] of real; { Температуры слоев. (0 - поверхность) }

{ ======== }

(* f2: text;
f1,f3: file of byte; *)


procedure nastroy; { Настройка исходных параметров }
var i: long; r: real;
begin
{ Исходная температура слоев }
for i:=0 to 1000001 do begin tem[i]:=Tn; p[i]:=0; end;
{ Кол-во циклов на час модельного времени }
chas:=3600 div Kvant;
{ Кол-во слоев в рассчете }
Kon:=1000000 div Sloy;
Sl:=Sloy/100; { Слой в метрах }
{ Масса слоя }
Msl:=PlB*Sl;
prRo:=Kvant/(RoB*Msl);
{ Снова температура слоев }
r:=(1773-225)/kon; for i:=0 to kon do begin
tem[i]:=225+r*i; end;
Raznos:=fl;
end; {end nastroy}

(* - - - Солнечная радиация - - - *)

procedure SvDay; { Лето-зима. Длина светового дня, поток солнечной энергии }
var sd,vys,rad: real;
begin { Беру за новый год самый короткий день }
rad:=(2*Pi*day)/365;
sd:=12-(6*cos(rad)); dl:=trunc((sd*3600)/Kvant);
Vos:=((chas*24) - dl) div 2; { Квант восхода солнца }
Zak:=Vos+dl; { Квант заката солнца }
{ Высота солнца в полдень. Беру родной Питер :) }
vys:=60+(23.4*cos(rad));
{ Приведенная солн. постоянная (к широте, ко времени года) }
psp:=SolC*cos((Pi*vys)/180);
end; {end SvDay}


function SolE:real;
{ Солнечная мощность в зависимости от времени суток и года }
var rad: real;
begin SolE:=0;
if tekT<=Vos then exit; if tekT>=Zak then exit;
rad:=Pi*((TekT-Vos)/dl); SolE:=psp*sin(rad)*kAlb;
end; {end SolE}

procedure TopBal; { Баланс солнечной энергии и излучения в космос }
var ps,dT,t,tt: real;
begin
t:=tem[0]; Ppl:=SolE;
tt:=t*t*0.0001; Pmin:=5.67*tt*tt; { Закон Стефана - Больцмана }
ps:=Ppl-Pmin; dT:=ps*prRo;
t:=t+dT; if t<0 then t:=0; tem[0]:=t;
end; {end TopBal}

procedure step(in1,in2:long); { Передача тепла от слоя in1 к in2 }
label 5,6;
var dt,t1,t2,t3,t4,p2: real; k: long;
begin
t1:=tem[in1]; t2:=tem[in2];
if t1=t2 then begin p[in2]:=0; exit; end;
k:=in1-in2; p2:=((t1-t2)*Tpr)/Sl;
dt:=p2*prRo; t3:=t1-dt; t4:=t2+dt;
if (t1>t2) and (t3t4) then goto 6;
5: { сохраняю новые значения }
tem[in1]:=t3; tem[in2]:=t4; p[in2]:=p2*k; exit;
6: { Модель пошла вразнос. Выравниваю температуры слоев }
Raznos:=tr; t3:=(t1+t2)/2; t4:=t3;
p2:=(t4-t2)/prRo; goto 5;
end; {end step}

function m2i(metr:long):long; { Переводит метры в индекс в массиве }
var rez: long;
begin
if metr>10000 then metr:=10000;
rez:=(metr*100) div Sloy; m2i:=rez;
end; {end m2i}

procedure outscr; { Вывод на экран монитора }
var i: long;
begin
write ('  0м   ',tem[1]:9:5,'  +',Ppl:8:5,'  -',Pmin:8:5,'  ',psp:9:4);
writeln('  ',(dl*Kvant)/3600.0:5:1);
i:=2;  writeln('  +1   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=3;  writeln('  +2   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=6;  writeln('  +5   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=10; writeln('  +10  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(001);  writeln('  1м   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(005);  writeln('  5м   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(010);  writeln('  10м  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(100);  writeln('  100м ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(500);  writeln('  500м ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(1000); writeln('  1км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(2000); writeln('  2км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(3000); writeln('  3км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(4000); writeln('  4км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(5000); writeln('  5км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(6000); writeln('  6км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(7000); writeln('  7км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(8000); writeln('  8км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=m2i(9000); writeln('  9км  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=Kon-m2i(100); writeln(' -100м ',tem[i]:9:5,'  ',p[i]:9:5);
i:=Kon-m2i(010); writeln(' -10м  ',tem[i]:9:5,'  ',p[i]:9:5);
i:=Kon-m2i(001); writeln(' -1м   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=Kon-10; writeln(' -10   ',tem[i]:9:5,'  ',p[i]:9:5);
i:=Kon-02; writeln(' -2    ',tem[i]:9:5,'  ',p[i]:9:5);
writeln(' 10км  ',tem[Kon]:9:5,'  ',Raznos,' ',Kon);
end; {end outscr}


procedure mogil; { Собственно, тепловой процесс в базальте }
var i,j,k,g,d: long;

begin
{ Задаю начальные условия }
nastroy;

for g:=1 to 50000 do begin god:=g; { годы - до посинения! }
for d:=1 to 365 do begin day:=d; tekT:=0; SvDay; { 1 год }
for k:=1 to 24 do begin { 1 день } 
writeln; writeln('Год ',god:5,'   день ',day:3,'   час ',k:3);

for i:=1 to chas do begin { 1 час }
tekT:=tekT+1; Raznos:=fl;
{ Температуры верхнего и нижнего слоя }
TopBal; tem[Kon]:=Tm;
{ Проходы сверху вниз и снизу вверх }
if (i mod 2)=1 then begin
for j:=Kon downto 1 do begin step(j,j-1); end; end else
begin for j:=0 to Kon-1 do begin step(j,j+1); end; end;
end; { 1час }
outscr;
end; { 1 день }
end; { 1 год  }
end; { по годам }
end; {end mogil}



begin
writeln; writeln;
writeln('(C) 2011 SHUMIL Co.               ЗЕМНАЯ  КОРА');
writeln;

mogil;
writeln; writeln('ВСЕ!'); writeln;
goto 9;

3: goto 9;
9: writeln('Финиш');
end.


==================================================


      А это - совсем другая область. Численный эксперимент. Расчет
тепловых процессов в трехмерном процессоре.

Исходные данные:

Процессор в центре кремниевого кубика 1х1х1см. Пять боковых стенок
охлаждаются до 45С. Шестая (нижняя) не охлаждается и не нагревается.
(По легенде там контакты.)
Процессор вырабатывает 120вт тепловой энергии.


      Модельное представление:

Кремниевый куб разбивается на 21х21х21 кубик.
Процессор - куб 7х7х7. Располагается в центре куба.
Начальная температура - 20С

Тепло (120вт) вырабатывается поровну всеми 7х7х7 кубиками процессора.

      Результат

Отвод тепла в установившемся режиме:
 ~20вт - верхняя грань. По 25вт - боковые грани, 0вт - нижняя грань
(с контактами).

Ниже температуры кубиков в установившемся режиме. (Разрез куба по
диагонали)

  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45  45
  45  45  45  45  45  46  46  46  47  47  47  47  47  46  46  46  45  45  45  45  45
  45  45  45  45  46  47  47  48  49  50  50  50  49  48  47  47  46  45  45  45  45
  45  45  45  46  46  48  49  50  52  53  53  53  52  50  49  48  46  46  45  45  45
  45  45  45  46  47  49  51  53  55  56  57  56  55  53  51  49  47  46  45  45  45
  45  45  45  46  48  50  53  56  59  61  62  61  59  56  53  50  48  46  45  45  45
  45  45  45  47  49  51  55  60  64  67  68  67  64  60  55  51  49  47  45  45  45
  45  45  46  47  49  52  57  65  71  76  77  76  71  65  57  52  49  47  46  45  45
  45  45  46  47  50  53  58  68  76  81  83  81  76  68  58  53  50  47  46  45  45
  45  45  46  47  50  54  60  70  79  84  86  84  79  70  59  54  50  47  46  45  45
  45  45  46  48  50  54  60  70  80  86  87  85  80  70  60  54  50  48  46  45  45
  45  45  46  48  50  54  60  70  79  85  87  85  79  70  60  54  50  48  46  45  45
  45  45  46  47  50  54  59  69  77  82  84  82  77  68  59  54  50  47  46  45  45
  45  45  46  47  50  53  58  66  73  77  79  77  73  66  58  53  50  47  46  45  45
  45  45  46  47  49  52  56  61  66  69  71  69  66  61  56  52  49  47  46  45  45
  45  45  46  47  49  51  54  58  61  64  65  64  61  58  54  51  49  47  46  45  45
  45  45  46  47  48  51  53  56  58  60  61  60  58  56  53  51  48  47  46  45  45
  45  45  45  47  48  50  52  54  56  57  58  57  56  54  52  50  48  47  45  45  45
  45  45  45  46  48  49  51  53  54  55  56  55  54  53  51  49  48  46  45  45  45
  45  45  45  46  48  49  51  52  53  54  55  54  53  52  51  49  48  46  45  45  45
  45  45  45  46  48  49  50  52  53  54  54  54  53  52  50  49  48  46  45  45  45

 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"