|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
29.05.2015, 03:37 | #1 | |
Работа с APDL Math. Почему Команда *dmat при параметре outofcore не отдаёт массив ?
Dr
Днепропетровск
Регистрация: 16.10.2011
Сообщений: 1,020
|
||
Просмотров: 2794
|
|
||||
Регистрация: 18.09.2011
Нахабино
Сообщений: 1,040
|
В хелпе по *EXPORT написано, что команда не работает с разреженными матрицами. Судя по всему *DMAT с функцией OUTofCORE эквивалентна *SMAT.
Если Вы работаете с большими (очень большими) массивами, то зачем перегонять в ARRAY? Вы пробовали ARRAY огромных размеров? Скорость работы с ними очень зависит от их размерности. Если уж прямо вот необходимо, то как вариант (медленный и некрасивый) обратная конструкция. Т.е. Вы сейчас по каждой ячейке заполняете матрицу, так же можно делать и с ARRAY. Можно для ускорения на Fortran функцию запилить, но прежде все-таки расскажите зачем Вам финальный ARRAY. P.S. Все разобрался.. попробуйте сделать ARRAY большой размерности, ну скажем 1e6 на 1e6 и все поймете Последний раз редактировалось MrWhite, 29.05.2015 в 10:06. |
|||
|
||||
Dr Регистрация: 16.10.2011
Днепропетровск
Сообщений: 1,020
|
MrWhite, да матрица большая будет размер матрицы равен количество элементов х количество элементов.
Перегоняют обратно в array так как в эту матрицу я записываю коэффициенты чувствительности, которые считаю Один раз в начале задачи, но потом в процессе решения я часто буду умножать матрицу sparse на вектор и в итоге получать вектор(вектор в памяти помещается). И именно этот вектор мне нужен. В процессе тестирования функции я обнаружил, что если первый dmat идет вне памяти, то я не могу экспортировать финальный array он получается размером 0х1. В сущности мне нужна матрица в которой будут такие числа, если расстояние между I элементом и y элементом меньше r_min, то это расстояние/ r_min, если больше 0. Дальше эти коэффициенты будут умножаться на вектор (кол элем ) со значениями параметров которые необходимо будет отфильтровать. И таким образом я снова получу вектор длиной равной количеству элементов. Данная операция будет происходить в цикле (только само умножение вектор чувствительности считаю один раз за циклом) Умножить матрицу sparse можно только на матрицу dense или вектор созданный таким же образом, по крайней мере умножить ее на array мне не удалось. P.s. Такой большой даже смысла делать нет, он будет весить порядка 40 гб. Поэтому и хочу чтоб это была sparse матрица, но ansys собирает sparse новые матрицы только из dense ( не нашел другого пути). Проблема еще и в том что по идее sparse матрицу можно экспортировать в asciI формате, dense s outofcore не дает этого сделать. |
|||
|
||||
Регистрация: 18.09.2011
Нахабино
Сообщений: 1,040
|
Если в ARRAY нужно занести только финальный вектор (я правильно понял?), то рекомендую не усложнять и без того сложную задачу. Просто создайте ARRAY нужной размерности и занесите в него значения вектора.
Если я понял неправильно, тогда уже можно по кусочкам кода разбираться, потому что на слух - тяжело Про размерность ARRAY 1e6 на 1e6 я написал исключительно в виду иллюстрации того почему разработчики не сделали экспорт разреженных матриц в ARRAY |
|||
|
||||
Dr Регистрация: 16.10.2011
Днепропетровск
Сообщений: 1,020
|
MrWhite, так и хочу просто тут заковыка вот в чем:
http://www.topopt.dtu.dk/files/TopOpt88.pdf работаю на основе этой статьи. Суть задачи: всем элементам присваивается условная плотность, на каждой итерации она изменяется для каждого элемента в зависимости от его вклада в энергию деформирования системы. Для того чтоб избежать шашечных решений производится фильтр параметров: учет влияния значений соседних ячеек в зоне r_min на элемент Код:
|
|||
|
||||
Dr Регистрация: 16.10.2011
Днепропетровск
Сообщений: 1,020
|
MrWhite, я просто хочу потом это h_e удалить, чтоб не работать с большим по весу файлом. В идеале первый проход просто экспортирует в файл sparse матрицу затем чищу всю память и работаю с уже созданной матрицей.
а вот с incore копирует. здесь и проблема мне кажется. там ещё была опечатка: сейчас чётко видно разницу: Код:
Последний раз редактировалось Stanum, 29.05.2015 в 12:33. |
|||
|
||||
Регистрация: 18.09.2011
Нахабино
Сообщений: 1,040
|
Да.. есть такое. Если операция *MULT обращается к матрице созданной OUTOFCORE, то ANSYS падает с характерной ошибкой. По деталям не могу сказать, но судя по всему нарушаются принципы обращения к памяти этого оператора (*MULT), по этой же причине не работает создание разреженной матрицы командой *SMAT, но там видимо прописан обработчик и вместо падения создается матрица нулевого размера.
Думаю это неразрешимая проблема. Придется искать другие пути решения. P.S. Задача очень интересная, жаль мне не приходится с такими сталкиваться в работе.. P.P.S. Кстати чудовищно долго ищется H_e_trial. Учитывая, что там цикл в цикле по количеству конечных элементов, думаю вопрос с матрицами на серьезной размерности задачи выйдет на второй план. С этим как думаете бороться? Последний раз редактировалось MrWhite, 29.05.2015 в 13:14. |
|||
|
||||
Dr Регистрация: 16.10.2011
Днепропетровск
Сообщений: 1,020
|
MrWhite, пока еще не думал, но основная задумка, что данную величину считаю всего раз, и на больших задачах та часть макроса что высчитывает x_e будет все-же больше. ( и там цикл каждый раз уменьшающийся)
В сущности н_е trial можно получить и матричными операциями, но в итоге опять же столкнусь с матрицей гигантского размера. Пока пришел к выводу, что модели из solid, Да и из мелких плоских элементов, придется связывать с маткад. (Буду выводить координаты центров элементов, и кое что про объем/площадь элементов, чтоб там уже собрать sparse матрицу, вывести ее из маткад, и подсоединить к Ansys. P.s *print, выдает матрицу полученную и тем и другим способом. Последний раз редактировалось Stanum, 29.05.2015 в 15:02. |
|||
|
||||
Регистрация: 18.09.2011
Нахабино
Сообщений: 1,040
|
Я бы на фортране или С++ написал бы функцию которая всю эту процедуру делает. Собственно из более менее сложного - это матричные операции, но они в и С++ и в фортране сторонними библиотеками реализованы.
Кстати, точно необходимо использовать ключ OUTOFCORE? Ansys вроде достаточно корректно работает с памятью, по идее должно хватать ее для запихивания матрицы. Вообщем пробовали определить при каком количестве КЭ у вас будут проблемы? А то может все проще, чем Вы думаете? |
|||
|
||||
Dr Регистрация: 16.10.2011
Днепропетровск
Сообщений: 1,020
|
MrWhite, при шаге разбиения 0.1 это порядка 50000 элементов. Моих 20 гб выделенных ansys не хватило. И он вылетел с ошибкой. А поскольку это только тестовая задача. Результат будет на значительно большей модели (сейчас 50 м3, а задача порядка 20000 м3 ), максимальный размер разбиения для финала 0.3 - 0.5, правда я думаю там элементов будет поменьше, так как много мест которые должны быть изначально пустыми (немного больше половины), итого от 80000 элементов. Поэтому необходимо чтоб он мог жевать много элементов. Там правда можно пытаться всунуть вилку, разбив все внутренние объемы на n частей, (условно -стены на этаже, перекрытие в ячейке) и тогда создавать фильтр для каждой такой группы в отдельности, тогда действительно можно что-то получать внутри системы так как объем каждой такой матрицы будет много меньше чем общей.
P.s. Я если честно с программированием знаком крайне поверхностно, объясните что за функцию вы имели ввиду? |
|||
|
||||
Регистрация: 18.09.2011
Нахабино
Сообщений: 1,040
|
Странно, я сейчас попробовал на задаче с 384 тыс. КЭ создать матрицу, полет нормальный даже не чихнул. У меня правда оперативки 128 гб, но тем не менее не вяжется.
Вот кусок лога - видно размер матрицы (ошибка из-за того что я размерность заведомо больше указал при обращении): Код:
По поводу создания своих команд в Ansys - в хелпе ищите по фразе: Creating External Commands Последний раз редактировалось MrWhite, 29.05.2015 в 16:28. |
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Акты скрытых работ | Витос | Прочее. Архитектура и строительство | 324 | 05.03.2015 12:24 |