• Регистрация
Dmitrii_S
Dmitrii_S 0.00
н/д

Сложности с расчетом при использовании сетки mesh с неравномерным шагом

Уважаемые форумчане, 

У кого есть опыт работы с функцией mesh?

Написан код, посвященный решению задачи теплопроводности: рассматривается нагрев воды лазерным импульсом, решается задача теплопроводности. 

Задается начальное распределение температуры среды, граничные условия и изучается распространение тепла с течением времени.

Изначально код работал с функцией generateMesh, задающей сетку с фиксированным размером ячейки, и при этом позволял выполнять расчеты для нескольких лазерных импульсов.

При этом конечное распределение температуры после 1-го лазерного импульса использовалось как начальное распределение для 2-го и т.д. Временной профиль теплового источника в коде задается переменной “A”.

С реализацией в 2021 версии Matlab сетки с переменным размером ячейки появилась возможность сократить время расчетов, увеличив шаг сетки ближе к стенкам области расчета (подальше от лазерного источника). Как только я заменил в коде задание сетки с равномерным шагом на неравномерный, код, к сожалению, перестал работать, в случае, если число импульсов более 1.

Расчет для нескольких импульсов реализован в цикле, в конце которого я запоминаю распределение температуры в узлах сетки в переменную Last_U. При попытке подставить это распределение в качестве начального для второго импульса выскакивает ошибка.

Я, очевидно, не понимаю какой-то тонкости работы с узлами сетки, не понимаю, на что ругается код и как эту ошибку исправить.


"Unable to perform assignment because the size of the left side is 
14424-by-1 and the size of the right side is 1-by-15111".

Помогите, пожалуйста, исправить ошибку.

В приложении архив с файлами:

For_forum_uniform.m - рабочий файл с равномерным шагом сетки.

For_forum_nonuniform.m - неработающий файл с неравномерным шагом сетки.

A_profile.mat - файл с переменной "А" временного профиля теплового источника.

Файлы

  • For_forum.zip

Теги

    22.11.2022

    Ответы

    • alextip
      alextip+44.13
      22.11.2022 21:37

      Элементам массива размером 14424-by-1 присваиваются значения элементов массива размером 1-by-15111. Так как количество элементов не совпадает, то выдается ошибка.

      При инициализации в структуру results записываются пустые поля, поэтому туда потом записывается все что угодно. Но на втором шаге цикла размеры массивов по какой-то причине различаются, поэтому присваивание результатов в те же поля структуры невозможно. Это происходит из-за того, что где-то в скрипте или используемой функции выполняется операция присваиваивания проиндексированных значений, типа ... = x(1:10), требующая совпадения размеров массивов.

      Чтобы сильно не заморачиваться, сделайте так чтобы на каждом шаге цикла результаты записывались в новую структуру. Например, можно прописать присваивание результатов в results типа nested structure и далее на i-м шаге цикла записывать результаты например в results(i).NodalSolution и т.д.

      • Dmitrii_S
        Dmitrii_S0.00
        22.11.2022 22:07

        Большое спасибо за ответ!

        Скажите, а в случае использования новой структуре в цикле типа results(i).NodalSolution

        не будет ли нарушена логика выполнения расчетов?

        Ведь задача передать результат расчетов в узлах (распределение температуры) в качестве начального значения этих узлов на следующем цикле.

        • aBoomest
          aBoomest+929.89
          22.11.2022 22:16

          Полагаю, что для этого также потребуются изменения.

      • aBoomest
        aBoomest+929.89
        22.11.2022 22:10

        createpde (не у всех такой компонент бывает)

        PS: На рисунке пример из хелпа с измененными двумя строчками. Ясно прослеживается разная сетка на графике.

        • alextip
          alextip+44.13
          22.11.2022 22:16

          Скажите, а в случае использования новой структуре в цикле типа results(i).NodalSolution

          не будет ли нарушена логика выполнения расчетов?

          Ведь задача передать результат расчетов в узлах (распределение температуры) в качестве начального значения этих узлов на следующем цикле.

          Так с ходу трудно сказать. Я попробовал поменять скрипт, с кондачка ничего не получилось :(

          • aBoomest
            aBoomest+929.89
            23.11.2022 12:40

            . . . . .

            Подробности не знаю, но получается одномерное распределение т-ры во вренмени. если б было двумерное, то был бы 3 мерный массив. Это наверно в данном случае не сильно важно.

            Я не знаком с тем что такое у вас model (как писал, ПДЕ тулс у нас нет, и не знаком с ним.) Есть мысль, что когда вы инициализируете в цикле (195), то в объекте model что-то меняется. Поэтому не прокатывает на следующей итерации, т.к. размер не тот.

            Ф-ция инициализации что делает?

            Ближайшие события