Опубликован: 25.10.2007 | Уровень: профессионал | Доступ: платный

Лекция 5: Численное решение уравнений в частных производных гиперболического типа с большими градиентами решений

5.9. TVD - схемы для квазилинейного уравнения с антидиффузией.

Повысить порядок аппроксимации TVD - схем можно, введя в уравнение переноса антидиффузионный член

$  \frac{{\partial}u}{{\partial}t} + \frac{{\partial}}{{\partial}x} \left(
{f + \frac{h}{\tau} \bar{f}}\right) = 0,   $

где дополнительный антидиффузионный поток имеет порядок погрешности аппроксимации и вводится по формуле

$ \bar{f} = h {\mu}({\sigma}, u) \frac{{\partial}u}{{\partial x}}.  $

Очевидно, что это дополнительное слагаемое в исходном уравнении будет иметь вид

$ \frac{{\partial}}{{\partial}x}(h {\mu}\frac{{\partial}u}
{{\partial}x}).  $

Таким образом, проведена коррекция потока, компенсирована аппроксиммационная вязкость. Хартен предложил модифицировать поток, введя в него функцию P:

$ \tilde{f}_{m + 1/2} = \frac{1}{2}(f_m + f_{m + 1} + 
P_{m + 1/2} ),  $

причем разные TVD - схемы различаются выбором этого слагаемого P. В исходном варианте разностной схемы, предложенной Хартеном, эта функция выбиралась следующим образом:

$  P_{m + 1/2} = \frac{h}{\tau}(\bar{f}_m + \bar{f}_{m + 1} - \left|{\xi_{m + 1/2} + \bar{\xi}_{m + 1/2}}\right| \Delta_{m + 1/2} u),  $

где \xi _{m + 1/2} = \sigma a_{m + 1/2},

$ \bar{f}_{m  \pm  1/2} = \frac{1}{2} \left({\left| {\xi_{m + 1/2}}\right| - \xi_{m + 1/2}^2}\right) \Delta_{m + 1/2}u.  $

\begin{gather*}  
\xi_{m + 1/2} = \left\{ \begin{array}{cc}
{\frac{\bar{f}_{m + 1} - \bar{f}_m}{u_{m + 1} - u_m}, } & {(u_{m + 1} - u_m) \ne 0} \\ 
{0, } & {(u_{m + 1} - u_m) = 0, } \\ 
\end{array} \right. \\ 
 \bar{f}_{m  \pm  1/2} = \frac{1}{2} \left(\left| \xi_{m + 1/2}\right| -  \xi^2_{m + 1/2}\right) \Delta_{m + 1/2}u.  \end{gather*}

Эта схема, тем не менее, приводила к заметному размазыванию разрывов в решении.

Приведем также другие виды ограничительной функции. Общий вид записи лимитера будет один и тот же:

P_{m + 1/2} = - \left[{{\sigma}Q_{m + 1/2} + \eta (a_{m + 1/2})(\Delta_{m + 1/2} u - Q_{m + 1/2} )}\right],

а Qm + 1/2 может выбираться из следующих вариантов:

\begin{gather*}
Q_{m + 1/2} = \min\bmod (\Delta_{m + 1/2} u, \Delta_{m - 1/2} u) + \\ 
 + \min\bmod (\Delta_{m + 1/2} u, \Delta_{m + 3/2} u) -  \Delta_{m + 1/2},   \\ 
Q_{m + 1/2} = \min\bmod (\Delta_{m - 1/2} u, \Delta_{m + 1/2}u, \Delta_{m + 3/2} u), \\ 
Q_{m + 1/2} = \min\bmod (2 \Delta_{m - 1/2} u, 2 \Delta_{m + 1/2} u), 2 \Delta_{m + 3/2} u, 0, 5(\Delta_{m + 3/2} u + \Delta_{m - 1/2})).   \end{gather*}

Еще один вариант выбора лимитера в уравнении квазилинейного типа будет

P_{m + 1/2} = - \left[{{\sigma}(a_{m + 1/2}^2 ) \tilde{Q}_{m + 1/2} + 
 \eta (a_{m + 1/2} )(1 - \bar{Q}_{m + 1/2} )}\right] \Delta_{m + 1/2} u,

С согласованным выбором функции \tilde{Q}_{m + 1/2} = Q_{m + 1/2} 
\cdot \Delta_{m + 1/2} u.

Введем обозначения показателей локальной гладкости решения

$  r^{-} = \frac{{\Delta_{m - 1/2} u}}{{\Delta_{m + 1/2} u}}, 
r^{+} = \frac{{\Delta_{m + 3/2} u}}{{\Delta_{m + 1/2} u}},   $

и представим функции Q(r -, r +), входящие в выражения для ограничения потока, в виде

\begin{gather*} Q(r^{-}, r^{+}) = \min\bmod(1, r^{-}) + \min\bmod(1, r^{+}) - 1, \\ 
Q(r^{-}, r^{+}) = \min\bmod(r^{-}, r^{+}), \\ 
Q(r^{-}, r^{+}) = \min\bmod(2, 2r^{-}, 2r^{+}, 0, 5(r^{-}+ r^{+}) ).  \end{gather*}

Итак, напомним основные идеи, направленные на построение TVD - схем повышенного порядка точности:

  • - построение гибридных схем, аналогичных методу коррекции потоков [15.17];
  • - построение схем с модифицированным по Хартену потоком [15.18];
  • - построение схем, основанных на методе Годунова второго порядка аппроксимации [15.20], [15.21].
Максим Радунцев
Максим Радунцев
Россия
Надежда Павленко
Надежда Павленко
Россия, Ставрополь

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7043102489776watchdog( )../bootstrap.inc:0
23.7050102492312module_invoke( )../bootstrap.inc:967
33.7050102494168call_user_func_array ( )../module.inc:462
43.7050102494504devel_watchdog( )../module.inc:462
53.7053102495360decode_entities( )../devel.module:382
63.7054102497296drupal_error_handler( )../devel.module:340
73.7054102501024watchdog( )../common.inc:663
83.7055102503184module_invoke( )../bootstrap.inc:967
93.7055102505064call_user_func_array ( )../module.inc:462
103.7055102505416devel_watchdog( )../module.inc:462
113.7056102506120decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7043102489776watchdog( )../bootstrap.inc:0
23.7050102492312module_invoke( )../bootstrap.inc:967
33.7050102494168call_user_func_array ( )../module.inc:462
43.7050102494504devel_watchdog( )../module.inc:462
53.7053102495360decode_entities( )../devel.module:382
63.7054102497296drupal_error_handler( )../devel.module:340
73.7054102501024watchdog( )../common.inc:663
83.7055102503184module_invoke( )../bootstrap.inc:967
93.7055102505064call_user_func_array ( )../module.inc:462
103.7055102505416devel_watchdog( )../module.inc:462
113.7056102506120decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7043102489776watchdog( )../bootstrap.inc:0
23.7050102492312module_invoke( )../bootstrap.inc:967
33.7050102494168call_user_func_array ( )../module.inc:462
43.7050102494504devel_watchdog( )../module.inc:462
53.7053102495360decode_entities( )../devel.module:382
63.7069102497480drupal_error_handler( )../devel.module:340
73.7070102501288watchdog( )../common.inc:663
83.7070102503448module_invoke( )../bootstrap.inc:967
93.7070102505328call_user_func_array ( )../module.inc:462
103.7071102505680devel_watchdog( )../module.inc:462
113.7072102506464decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7043102489776watchdog( )../bootstrap.inc:0
23.7050102492312module_invoke( )../bootstrap.inc:967
33.7050102494168call_user_func_array ( )../module.inc:462
43.7050102494504devel_watchdog( )../module.inc:462
53.7053102495360decode_entities( )../devel.module:382
63.7069102497480drupal_error_handler( )../devel.module:340
73.7070102501288watchdog( )../common.inc:663
83.7070102503448module_invoke( )../bootstrap.inc:967
93.7070102505328call_user_func_array ( )../module.inc:462
103.7071102505680devel_watchdog( )../module.inc:462
113.7072102506464decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7085102490320watchdog( )../bootstrap.inc:0
23.7086102492456module_invoke( )../bootstrap.inc:967
33.7086102494312call_user_func_array ( )../module.inc:462
43.7086102494648devel_watchdog( )../module.inc:462
53.7087102495352decode_entities( )../devel.module:382
63.7088102497288drupal_error_handler( )../devel.module:340
73.7088102501016watchdog( )../common.inc:663
83.7088102503176module_invoke( )../bootstrap.inc:967
93.7088102505056call_user_func_array ( )../module.inc:462
103.7089102505408devel_watchdog( )../module.inc:462
113.7089102506112decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7085102490320watchdog( )../bootstrap.inc:0
23.7086102492456module_invoke( )../bootstrap.inc:967
33.7086102494312call_user_func_array ( )../module.inc:462
43.7086102494648devel_watchdog( )../module.inc:462
53.7087102495352decode_entities( )../devel.module:382
63.7088102497288drupal_error_handler( )../devel.module:340
73.7088102501016watchdog( )../common.inc:663
83.7088102503176module_invoke( )../bootstrap.inc:967
93.7088102505056call_user_func_array ( )../module.inc:462
103.7089102505408devel_watchdog( )../module.inc:462
113.7089102506112decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7085102490320watchdog( )../bootstrap.inc:0
23.7086102492456module_invoke( )../bootstrap.inc:967
33.7086102494312call_user_func_array ( )../module.inc:462
43.7086102494648devel_watchdog( )../module.inc:462
53.7087102495352decode_entities( )../devel.module:382
63.7100102497480drupal_error_handler( )../devel.module:340
73.7100102501288watchdog( )../common.inc:663
83.7100102503448module_invoke( )../bootstrap.inc:967
93.7101102505328call_user_func_array ( )../module.inc:462
103.7101102505680devel_watchdog( )../module.inc:462
113.7102102506464decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.7085102490320watchdog( )../bootstrap.inc:0
23.7086102492456module_invoke( )../bootstrap.inc:967
33.7086102494312call_user_func_array ( )../module.inc:462
43.7086102494648devel_watchdog( )../module.inc:462
53.7087102495352decode_entities( )../devel.module:382
63.7100102497480drupal_error_handler( )../devel.module:340
73.7100102501288watchdog( )../common.inc:663
83.7100102503448module_invoke( )../bootstrap.inc:967
93.7101102505328call_user_func_array ( )../module.inc:462
103.7101102505680devel_watchdog( )../module.inc:462
113.7102102506464decode_entities( )../devel.module:382